【问题标题】:SQL query returns rows as long as it's not row 56 specifically只要不是第 56 行,SQL 查询就会返回行
【发布时间】: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”。我找到了一个翻译函数来运行我的结果以防止出现问题:

json_encode function: special characters

【问题讨论】:

  • id 可能有一个空格(或其他一些空格)吗? ...可以尝试在$wl_id 上使用trim()

标签: php mysql


【解决方案1】:

看起来我在上面发布了解决方案,但最好将它正式包含在答案中......事实证明我在返回的输入上使用了 JSON 解码或其他类似功能。如果用户从某处粘贴文本并且其中包含 unicode 字符,则显然 json_decode 会死掉。所以发生的事情是包含这些字符的某些行会导致解码失败,因此该行的结果特别是空白。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多