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

时间:2017-12-26 18:32:46

标签: php mysql sql prepared-statement

我正在调用一个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编辑器中运行,则它会毫无问题地执行。

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

2 个答案:

答案 0 :(得分:0)

我看不到/字符与此有任何关系,但我会打赌url列比您尝试的其他列更大,因此请检索其中的许多字符可能会让你超过内存限制。

尝试更改:

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

要:

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

用于更高效的JOIN操作。

答案 1 :(得分: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