所以我在使用SQL子句和PHP命令时遇到了一个非常奇怪的问题。出于某种原因,我的代码在使用命令时工作正常
"SELECT * FROM tableName WHERE columnName=text";
但使用时不起作用
"SELECT * FROM tableName";
我已将SQL命令直接放入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,我似乎无法弄明白。
更新:正如Marshall所说,我认为现在的问题是不是UTF-8的数据,导致JSON编码失败并且不显示任何数据。该表有数百个条目长,因此我将在编码之前过滤掉非UTF-8字符以查看它是否有效。
更新2:发现问题。我有另一个脚本贯穿单个事件的团队列表(这一个类似但是全年都返回所有团队),我浏览了列表,直到它失败了,类似于这个。具有非UTF-8字符的加拿大事件是导致脚本失败的原因。蒙特利尔在数据库中显示为Montréal,在Québec中显示为Québec。该代码之前的工作原理只是因为在最初测试代码时该事件不存在,并且é是不受支持的字符。这也解释了为什么代码使用WHERE子句和array []函数,因为在任何一种情况下它都不会遇到格式错误的数据。正确地过滤进来的数据就像我应该没有造成这样的,但至少现在我知道原因,我真的被困在这一个上,因为代码看起来正确并且SQL命令也是正确的。感谢大家的帮助。
更新3:好的,所以这是完整的解决方法。我将PHPMyAdmin中的所有内容修改为utf8mb4_unicode_ci排序规则和utf8mb4字符集。然后修改了从API获取数据并将其输入数据库的脚本。我正在使用PDO连接到数据库,所以我将字符集添加到PDO条目。
$dbh = new PDO("mysql:host=localhost;dbname=dbname;charset=utf8mb4", 'username', 'password');
这使数据正确进入数据库,但JSON解析器仍然无效。发现我还需要明确告诉它在UTF-8MB4字符集中工作。添加
$con->set_charset("utf8mb4");
在SQL查询修复之前的PHP脚本。现在,正确的字符遍历数据进入数据库的位置和请求的时间。所以问题是当数据通过这样的时候,脚本没有设置为UTF-8。希望这可以帮助有类似问题的人。
答案 0 :(得分:1)
为什么不让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()
,请参阅here,然后执行此操作:
// Use the query from above
$res = mysqli_query($con,$sql);
$result = array();
while($r = mysqli_fetch_assoc($res, MYSQLI_ASSOC)) array_push($result, $r);
答案 1 :(得分:0)
确保$row
包含array_push
函数中所有必需的索引。您应该验证$row
。
来自mysqli_fetch_array手册:
Note: This function sets NULL fields to the PHP NULL value.