因此,我在使用SQL子句和PHP命令时遇到了一个非常奇怪的问题。由于某些原因,我的代码在使用命令"SELECT * FROM tableName WHERE columnName=text";
时运行良好,但在使用"SELECT * FROM tableName";
时不工作--我已经将该命令直接放入MySQL中,并返回结果。如果我对行数组进行内爆,就会得到结果,如果我从使用array_push($result...)
切换到$result= []
,我将得到最后一个JSON格式的条目,就像预期的那样。我不知道为什么会有这种行为,我认为这段代码适用于以前版本的PHP,或者可能是较旧版本的MySQL。我最近做了一些更新,现在一切都是最新的版本。搜索发现那些同时具有array_push和array[]的人不能工作,或者命令不能使用where子句,但我的问题正好相反。不确定会是什么,我启用了PHP错误报告和SQL错误报告,当问题发生时,我只得到PHP白屏幕。
<?php
error_reporting(-1);
define('HOST','localhost');
define('USER','dbuser');
define('PASS','dbpassword');
define('DB','dbname');
$eventYear = isset($_GET["year"]) ? $_GET["year"] : '';
$eventYear = addslashes($eventYear);
if (empty($_GET["year"])){
$eventYear = 2016;
}
$con = mysqli_connect(HOST,USER,PASS,DB) or die ("Database Connection Failed");
$sql = "SELECT * FROM tableName";
$res = mysqli_query($con,$sql);
if (!$res) {
printf("Error: %s\n", mysqli_error($con));
exit();
}
$result = array();
while($row = mysqli_fetch_array($res)){
array_push($result,
array('teamNumberLabel'=>'Team Number',
'teamNumber'=>$row["teamNumber"],
'teamEventLabel'=>'Team Event Name',
'teamEvent'=>$row["teamEvent"],
'teamDistrictCodeLabel'=>'District Code: ',
'teamDistrictCode'=>$row["teamDistrictCode"],
'teamCityLabel'=>'City: ',
'teamCity'=>$row["teamCity"],
'teamStateProvLabel'=>'State/Province: ',
'teamStateProv'=>$row["teamStateProv"],
'teamCountryLabel'=>'Country: ',
'teamCountry'=>$row["teamCountry"],
'teamNameFullLabel'=>'Sponsors: ',
'teamNameFull'=>$row["teamNameFull"],
'teamNameShortLabel'=>'Nickname: ',
'teamNameShort'=>$row["teamNameShort"],
'teamRobotNameLabel'=>'Name: ',
'teamRobotName'=>$row["teamName"],
'teamRookieYearLabel'=>'Rookie Year: ',
'teamRookieYear'=>$row["teamRookieYear"],
'teamWebsiteLabel'=>'Website: ',
'teamWebsite'=>$row["teamWebsite"]
));
}
header('Content-Type: application/json');
echo json_encode(array("result" => $result));
mysqli_close($con);
?>
我有很多具有类似代码的其他文件,但是它们都包含SQL命令中的WHERE子句,所以所有这些都按预期工作。如果没有where子句,问题就不存在了。我试过将引号放在表名周围,但它显示了不正确的SQL语法,所以不是这样的。还阅读了SQL命令和array_push,我似乎无法理解。
更新:正如马歇尔所说的那样,我认为现在的问题是UTF-8中没有的数据,这会导致编码失败而不显示任何数据。这个表有数百个条目,所以在编码之前,我要过滤掉非UTF-8字符,看看它是否有效。
更新2:发现了这个问题。我有另一个脚本,它在单个事件的团队列表中运行(这个脚本类似,但返回了整个一年的所有团队),我遍历了这个列表,直到它失败了类似于这个事件。非UTF-8字符的加拿大事件是导致脚本失败的原因。Montréal在数据库中显示为Montr C.al,在魁北克显示为魁北克。代码运行得更早,只是因为最初测试代码时不存在此事件,而且该事件是一个不受支持的字符。这也解释了为什么代码与WHERE子句和array[]函数一起工作,因为在这两种情况下它都不会触及格式错误的数据。正确地过滤进来的数据,就像我本来不应该造成的那样,但至少现在我知道了原因,因为代码看起来是正确的,SQL命令也是正确的,所以我真的被困在了这个原因上。谢谢大家的帮助。
更新3:,好的,这是完整的修复。我将PHPMyAdmin中的所有内容修改为utf8mb4_unicode_ci排序规则和utf8mb4字符集。然后修改从API获取数据并将其输入数据库的脚本。我使用PDO连接到db,所以我将字符集添加到PDO条目中。
$dbh = new PDO("mysql:host=localhost;dbname=dbname;charset=utf8mb4", 'username', 'password');
这使数据正确地进入数据库,但是JSON解析器仍然无法工作。发现我还需要明确告诉它在UTF-8MB4字符集中工作。添加
$con->set_charset("utf8mb4");
到SQL查询之前的PHP脚本。现在,正确的字符将通过数据进入数据库的位置和请求的时间。所以问题是,当数据通过时,脚本没有被设置为UTF-8。希望这能帮助有类似问题的人。
发布于 2016-05-11 06:57:03
为什么不让MySQL来处理所有的数据操作呢。
$sql = "SELECT
'Team Number' as teamNumberLabel,
teamNumber,
'Team Event Name' as teamEventLabel,
teamEvent,
'District Code: ' as teamDistrictCodeLabel,
teamDistrictCode,
'City: ' as teamCityLabel,
teamCity,
'State/Province: ' as teamStateProvLabel,
teamStateProv,
'Country: ' as teamCountryLabel,
teamCountry,
'Sponsors: ' as teamNameFullLabel,
teamNameFull,
'Nickname: ' as teamNameFull,
teamNameShort,
'Name: ' as teamRobotNameLabel,
teamName as teamRobotName,
'Rookie Year: ' as teamRookieYearLabel,
teamRookieYear,
'Website: ' as teamWebsiteLabel,
teamWebsite
FROM tableName";
$res = mysqli_query($con,$sql);
$result = mysqli_fetch_all($res, MYSQLI_ASSOC);
print_r($result);
使用mysqli_fetch_all()
一次获得所有结果并跳过循环。
如果不能使用mysqli_fetch_all()
,请参阅这里,然后执行以下操作:
// Use the query from above
$res = mysqli_query($con,$sql);
$result = array();
while($r = mysqli_fetch_assoc($res, MYSQLI_ASSOC)) array_push($result, $r);
发布于 2016-05-11 06:52:39
确保$row
在array_push
函数中包含所有必需的索引。您应该验证$row
。
来自数组手册:
Note: This function sets NULL fields to the PHP NULL value.
https://stackoverflow.com/questions/37165955
复制