【发布时间】:2021-02-24 01:51:50
【问题描述】:
我有这样的代码返回给定列表的所有项目:
function get_items($wl_id){
global $db;
// Get all for this list
return $db->get_rows('SELECT * FROM wl_items WHERE wl_id = ? ORDER BY priority ASC,date_mod DESC',[$wl_id]);
}
这是一个诊断页面,因此除了查询结果的 JSON 输出之外没有任何值。对于给定的愿望清单 ID,它将所有行作为行数组(列数组)抓取。如果我输入 54、55 或 57,但不是 56,它会起作用。我检查并重新检查了代码,无论我做什么,它都是空白的。当我输入一个不存在的 id 时,我至少得到一个 [] 空数组返回。
但不知何故,在 56 上,我什么也没得到。什么都没有。只是一个空白页。
如果我一路转储变量,我会看到我所期望的一切。我看到 id 的值为 56 或其他任何值,我看到查询已按预期填写。如果我在数据库上手动运行查询,一切都很好。
以防万一数据库中的特定行有些奇怪,我手动更改了每一列中的值(ID 除外)以确保。如果我查看应该退回的特定物品,没有什么不寻常的。
我不知道下一步该做什么。除了“TEH LULZ”的少数几个数字之外,它如何能完美地工作?它对少数其他数字(例如 151)有这种奇怪的行为,但我看不出是什么原因造成的。
当我向它发送一个密钥时,它应该返回属于该列表的所有项目。确实如此;完美无瑕 - 如果我手动运行查询或当它不是 56(或 114 或 91)时
这是我用来在我的 db 类中触摸 db 的代码:
public function exec($query,$params_arr=[])
{
// Nonsense causes problems (and isn't readable)
$query = preg_replace("/[\r\n\t]/",' ',$query);
$query = preg_replace('/\s+/', ' ', $query);
$this->err = null;
$this->sth = $this->dbh->prepare($query);
try {
$this->sth->execute($params_arr);
$this->last_query = $this->sql_debug($query,$params_arr);
$_SESSION['diag'][] = $this->last_query;
}
catch (Exception $e) {
$this->err = $e->getMessage();
return 0;
}
return 1;
}
public function get_rows($query,$params_arr=[])
{
$result = $this->exec($query,$params_arr);
return $this->sth->fetchAll(PDO::FETCH_ASSOC);
}
我想再次强调,这段代码在其他所有方面都完美无缺。页面加载,它获取数据,它只是在这个 ONE 查询上失败,具体取决于使用的 id。
另请注意,这在我的本地系统上完美运行,仅在实时服务器上失败。
为了尽可能消除,我在一个新的 PDO 实例中手动连接到数据库,如下所示:
$dbh = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
if (!$sth = $dbh->prepare("SELECT * FROM wl_items WHERE wl_id=56 ORDER BY priority ASC,date_mod DESC"))
echo "failed";
echo $wl_id;
$sth->execute();
// $sth->execute([''+$wl_id]);
output($sth->fetchAll(PDO::FETCH_ASSOC));
===================================== 明白了!
这是我的输出函数。它转换为显然讨厌某些特殊字符的“json_encode”。我找到了一个翻译函数来运行我的结果以防止出现问题:
【问题讨论】:
-
id 可能有一个空格(或其他一些空格)吗? ...可以尝试在
$wl_id上使用trim()。