PHP array_push()不起作用,但是array []不起作用,只有没有SQL where where

时间:2016-05-11 14:39:08

标签: php mysql sql arrays

所以我在使用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。希望这可以帮助有类似问题的人。

2 个答案:

答案 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.
相关问题