0

这是代码。$fieldNamesA 和 $fieldValsA 是在 foreach 循环中从 POST 变量创建的:

$fieldNamesS = implode(',',$fieldNamesA);
$fieldValsS = implode(',',$fieldValsA);
$mysqli = new mysqli('localhost', 'user', 'pw', 'db');
mysqli_report(MYSQLI_REPORT_ALL);

$stmt = $mysqli->prepare('INSERT INTO users (?) VALUES (?)');
if ($stmt === FALSE) {
    die ("Mysql Error: " . $mysqli->error);
}
$stmt->bind_param('ss', $fieldNamesS,$fieldValsS);
$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

以下是错误消息:

Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?) VALUES (?)' at line 1' in userreg.php:47
Stack trace:
#0 userreg.php(47): mysqli->prepare('INSERT INTO use...')
#1 {main}
  thrown in /userreg.php on line 47

我不明白为什么它抱怨我的插入语句有问题。如果我对列/字段名称进行硬编码,则会收到一个错误,即列数与值数不匹配,这是不正确的。我 var_dumped 变量只是为了确保它们具有相同数量的参数。

4

2 回答 2

1

我认为您不能使用 PHP Mysqli 为列名使用占位符。

查看这个答案,它讨论了我为扩展 mysqli 类而编写的 PHP 类。它将为您节省一些时间,并且它还会执行所有自动占位符绑定。

better_mysqli 类

于 2013-06-24T20:22:32.567 回答
0

您需要提供左侧字段的名称,VALUES然后您需要一个?对于每个值:

INSERT INTO some_table (some, columns) VALUES (?, ?)

编辑

列列表中不能有占位符。见http://php.net/manual/en/mysqli.prepare.php

标记仅在 SQL 语句中的某些位置是合法的。例如,在 INSERT 语句的 VALUES() 列表中允许使用它们(以指定行的列值),或者在与 WHERE 子句中的列进行比较以指定比较值时。

但是,它们不允许用于标识符(例如表名或列名),在命名要由 SELECT 语句返回的列的选择列表中,或指定二元运算符(例如 = 等号)的两个操作数。 .

于 2013-06-24T20:20:55.883 回答