Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP+mySQL:Prepare,bind_param没有像我期望的那样工作_Php_Mysql_Mysqli - Fatal编程技术网

PHP+mySQL:Prepare,bind_param没有像我期望的那样工作

PHP+mySQL:Prepare,bind_param没有像我期望的那样工作,php,mysql,mysqli,Php,Mysql,Mysqli,我将在这里举两个例子,$stmt=$mysqli->prepare+$stmt->bind_param deny to work,我自己也不明白为什么。 不工作: if ($stmt = $mySQLi->prepare("DROP DATABASE ?")) { $stmt->bind_param('s', $db_name); $stmt->execute(); $stmt->store_result(); } if

我将在这里举两个例子,$stmt=$mysqli->prepare+$stmt->bind_param deny to work,我自己也不明白为什么。 不工作:

if ($stmt = $mySQLi->prepare("DROP DATABASE ?")) {
        $stmt->bind_param('s', $db_name);
        $stmt->execute(); 
        $stmt->store_result();
}
if ($stmt = $strSQLi->prepare("SELECT ? FROM Strings.texts WHERE keyName = ? LIMIT 1")) {
        $stmt->bind_param('ss', strtolower($lang), strtolower("help_".$key));
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($result);
}
当前工作环境:

 if ($stmt = $mySQLi->prepare("DROP DATABASE $db_name")) {
        //$stmt->bind_param('s', $db_name);
        $stmt->execute(); 
        $stmt->store_result();
 }
if ($stmt = $strSQLi->prepare("SELECT {strtolower($lang)} FROM EVEStrings.texts WHERE keyName = ? LIMIT 1")) {
        $stmt->bind_param('s', strtolower("help_".$key));
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($result);
}
不工作:

if ($stmt = $mySQLi->prepare("DROP DATABASE ?")) {
        $stmt->bind_param('s', $db_name);
        $stmt->execute(); 
        $stmt->store_result();
}
if ($stmt = $strSQLi->prepare("SELECT ? FROM Strings.texts WHERE keyName = ? LIMIT 1")) {
        $stmt->bind_param('ss', strtolower($lang), strtolower("help_".$key));
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($result);
}
当前工作环境:

 if ($stmt = $mySQLi->prepare("DROP DATABASE $db_name")) {
        //$stmt->bind_param('s', $db_name);
        $stmt->execute(); 
        $stmt->store_result();
 }
if ($stmt = $strSQLi->prepare("SELECT {strtolower($lang)} FROM EVEStrings.texts WHERE keyName = ? LIMIT 1")) {
        $stmt->bind_param('s', strtolower("help_".$key));
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($result);
}
知道为什么吗?

这就是mysqli::prepare的工作原理。它完全写在文档中

这些标记仅在SQL语句中的某些位置是合法的。对于 例如,它们在INSERT语句的值列表中是允许的 为行或与列进行比较时指定列值的步骤 在WHERE子句中指定比较值

但是,它们不允许用于表或列等标识符 名称,在“选择”列表中,该列表为要由 SELECT语句,或指定二进制运算符的两个操作数 例如=等号。后一种限制是必要的,因为 无法确定参数类型。不是 是否允许通过将标记与NULL进行比较?也为空。一般来说 参数仅在数据操作语言DML中是合法的 语句,而不是数据定义语言DDL语句

这一部分主要是:它们不允许用于表名或列名等标识符

绑定参数的思想是将查询发送到数据库引擎,并在runtine中绑定给定的值。如果未指定表,则引擎无法生成有效语句,因此无法继续执行查询和绑定参数

我不建议一般使用动态表名,不管它是否安全。然而,如果你真的坚持这样做,不要让用户来决定。在应用程序级别决定{strtolower$lang},即从数组而不是从用户输入决定。

这就是mysqli::prepare的工作方式。它完全写在文档中

这些标记仅在SQL语句中的某些位置是合法的。对于 例如,它们在INSERT语句的值列表中是允许的 为行或与列进行比较时指定列值的步骤 在WHERE子句中指定比较值

但是,它们不允许用于表或列等标识符 名称,在“选择”列表中,该列表为要由 SELECT语句,或指定二进制运算符的两个操作数 例如=等号。后一种限制是必要的,因为 无法确定参数类型。不是 是否允许通过将标记与NULL进行比较?也为空。一般来说 参数仅在数据操作语言DML中是合法的 语句,而不是数据定义语言DDL语句

这一部分主要是:它们不允许用于表名或列名等标识符

绑定参数的思想是将查询发送到数据库引擎,并在runtine中绑定给定的值。如果未指定表,则引擎无法生成有效语句,因此无法继续执行查询和绑定参数


我不建议一般使用动态表名,不管它是否安全。然而,如果你真的坚持这样做,不要让用户来决定。根据应用程序级别决定{strtolower$lang},即从数组而不是从用户输入。

据我从PDO了解,我认为mysqli也是如此,这是无法做到的

bind_param和bind_value只能绑定值,不能绑定表名或列名


您必须手动筛选数据,可能使用白名单方法。

据我从PDO了解,我认为mysqli也一样,这是无法做到的

bind_param和bind_value只能绑定值,不能绑定表名或列名


您必须手动筛选数据,可能使用白名单方法。

您不能绑定表名、表列名。只能在绑定中绑定属性值。不能绑定表名、表列名。您只能在绑定中绑定属性值。我不允许用户在查询中放入任何内容$lang是另一次从数据库获取的结果。但是谢谢你的回答!信息量很大!现在我知道了。我不会让用户在查询中输入任何内容$lang是另一次从数据库获取的结果。但是谢谢你的回答!信息量很大!现在我知道了。