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

标签 php mysql sql arrays

所以我在使用 SQL 子句和 PHP 命令时遇到了一个非常奇怪的问题。由于某种原因,我的代码在使用命令时工作正常 “SELECT * FROM tableName WHERE columnName=text”; 但使用时不起作用 “从表名中选择*”; 我已经将 SQL 命令直接放入 MySQL,它返回结果。如果我内爆行数组,我会得到结果,如果我从使用切换 array_push($结果...)$结果= [] 正如预期的那样,我得到了 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。该代码较早运行只是因为在最初测试代码时此事件不存在,并且 é 是不受支持的字符。这也解释了为什么代码可以使用 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。希望这可以帮助遇到类似问题的人。

最佳答案

为什么不让 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);

关于PHP array_push() 不起作用,但 array[] 起作用,只是没有 SQL where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37165955/

相关文章:

php - 从数据库中选择多个值中的一个值

PHP curl : The usage of the @filename API for file uploading is deprecated

mysql - 如何对现有表进行分组、加入和正确执行聚合

mysql - 排序依据和分组依据

MySQL 左外连接多张表

PHP SoapClient 构造函数非常慢

javascript - 如何从 JavaScript 调用 wordpress is_logged_in 函数

mysql - 使用 Rails + MySql 的 Web 服务最佳实践

php - "Undefined index"仅适用于 HTML 表单中的 "file"字段

mysql - SQL 和连接