是否有可能使用变量,而不是一个文字在准备语句?如果有,怎么做呢?


Is it possible to use variables instead of a literal in prepared statements? If so, how?

我的意思是,我当前的预处理语句是这样开始的:

$stmt = $bd->prepare("SELECT Beer_Name FROM Beer WHERE Gluten = ?");

但是像这样做是可能的吗?因为我试过好几种方法,但都没有成功。

$stmt = $bd->prepare("'.$sql.'");

我问,因为我试图创建一个函数,因为我正在编写一个使用大量查询的网站。

<?php
include('connection.php');

    global $sql;
    global $ready;

        $sql = 'SELECT Beer_Name FROM Beer WHERE Gluten = ?';
        $ready = "Yes";

function bindingHelper($ready, $sql) {
            $stmt = $bd->prepare($sql);
            $stmt->bind_param("s", $ready);
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result($beer_name);
            $stmt->fetch();
            echo($beer_name);
}
bindingHelper($ready, $sql);
?>

我实际上没有注意到,是的,我有一个很好的想法。我们都会犯错。我移动了include('connection.php');在函数内部,现在它完美地工作了。请加上这个作为答案,我将接受。——user3822332

按OP的要求。

这里有一个变量作用域的问题。

  • http://php.net/manual/en/language.variables.scope.php

因此,您的变量不能从函数访问。

  • 在他们提出的问题下建立解决方案。

错误检查链接引用:

  • http://php.net/manual/en/mysqli.error.php
  • http://php.net/manual/en/function.error-reporting.php

PHP字符串101:

你有这个:

$sql = "SELECT 'foo'";
$stmt = $bd->prepare("'.$sql.'");

你将发送这个文字查询到数据库:

   '.SELECT 'foo'.'
   ^^------------^^- quotes and . from the prepare() call
     ^^^^^^^^^^^^--- contents of $sql

由于数据库完全没有知道这个字符串是如何创建的,所以它接受它的表面值:

  '.SELECT 'foo'.'
  ^^^^^^^^^^--- string literal
            ^^^--- unknown keyword
               ^^^--- string literal

这些都不是有效的sql,因此整个"查询"是无效的