我有以下代码。
`$ db = mysqli_connect('localhost','zyk','nuithadit6-6-6','phpAdv');
if ( mysqli_connect_errno() )
{
printf("Connect failed: %s\n", mysqli_connect_errno() );
exit();
}
$thisDB = mysqli_prepare($db, "CREATE DATABASE ?");
echo mysqli_stmt_error($thisDB);;`
运行此代码时,我收到以下警告:
PHP警告:mysqli_stmt_error()要求参数1为mysqli_stmt,布尔值在第13行的/Library/WebServer/Documents/phpAdvanced/cap1/createDB.php中给出。
如果我将mysqli_prepare函数的第二个参数更改为以下内容:
“创建数据库myDB”
然后警告就消失了。当查询字符串中包含变量时,似乎mysqli_prepare不喜欢它,当我以这种方式使用它时,它会为$ thisDB返回NULL。据我了解,这不是预期的行为。我一直在阅读手册和论坛,但仍然没有答案。有谁知道为什么mysqli_prepare没有返回适当的值?
mysqli的版本是5.0.8,而我的php版本是5.3.15。
答案 0 :(得分:0)
预备语句不接受任何MySQL标识符的占位符。这包括数据库,表和列名称。您只需将表名的已清理版本连接到语句并使用mysqli_query()
。
原因是:MySQL将在准备时解析准备好的语句并准备完整的执行计划。这包括它将使用哪些表,哪些索引以及它将如何从列中进行选择。执行语句时,它会将变量数据替换为执行计划并创建结果。
如果您尝试准备包含MySQL实体(如表格未知)的语句,MySQl将无法创建执行计划。