当使用特殊字符调用列时,PHP准备了sql语句中断

问题描述 投票:0回答:2

我正在调用一个php脚本,每次调用一个列时都会中断(其中有一个url示例http://www.sample.com/something)。

我得到的错误是PHP致命错误:允许的内存大小为134217728字节耗尽(试图分配4294967296字节)

我不想通过扩展内存来解决问题,我怀疑无论如何都会解决问题。

我尝试执行准备好的语句后出现问题(在这行代码之后我的脚本打破了$stmt->execute();

问题肯定是因为我的网址列中的斜线字符'/'。如果我在没有“/”符号的情况下调用任何其他列,则语句将正确执行并呈现数据。

这是我的更多代码:

$stmt = $conn->prepare("
SELECT post.id, content_cite, url FROM post, data 
WHERE post.id = data.post_FK AND data.age < ? AND data.age <> ?");


$stmt->bind_param("ii", $one, $two);

// params
$one = 35;
$two = 0;
$stmt->execute();

// select header params
$stmt->bind_result($col_1, $col_2, $col_3);
while ($stmt->fetch()) {
    $json = array(
        'id' => $col_1,
        'content_cite' => $col_2,
        'url'=> $col_3

    );

    array_push($contentArray, $json);
}

正如我所说,url列是问题所在。如果此语句在SQL编辑器中运行,则它会毫无问题地执行。

有什么想法在这里发生了什么?

php mysql sql prepared-statement
2个回答
0
投票

我无法看到/角色与此有任何关系,但我会打赌url专栏比你尝试的其他专栏更大,所以检索其中许多可能会让你超过内存限制。

尝试改变:

FROM post, data 
WHERE post.id = data.post_FK

至:

FROM post INNER JOIN data 
  ON post.id = data.post_FK

为了更有效的JOIN操作。


0
投票
  • 无需释放/放弃bind_param
  • 不需要INNER JOIN而不是WHERE

这解决了这个问题:

 $stmt = $conn->prepare("
    SELECT post.id, content_cite, url FROM post, data 
    WHERE post.id = data.post_FK AND data.age < ? AND data.age <> ?");


    $stmt->bind_param("ii", $one, $two);

    // params
    $one = 35;
    $two = 0;
    $stmt->execute();


// if you have longtext as a type in your database you must call this method
        mysqli_stmt_store_result($stmt);


$stmt->bind_result($col_1, $col_2, $col_3);
    while ($stmt->fetch()) {
         $json = array(
            'id' => $col_1,
            'content_cite' => $col_2,
            'url'=> $col_3

        );

        array_push($contentArray, $json);
    }

Tnx Prepared mysqli select statement on longtext field is coming back empty

© www.soinside.com 2019 - 2024. All rights reserved.