Php 使用准备好的语句时预定义语句
首先,如果我的标题不能很好地解释这种情况,我很抱歉,我想不出一个好的标题。Php 使用准备好的语句时预定义语句,php,mysql,Php,Mysql,首先,如果我的标题不能很好地解释这种情况,我很抱歉,我想不出一个好的标题。 我试图从一个表单中获取所有输入,并将它们放入数据库。我现在不是100%确定这是否可行,但我想我会把它贴出来确认一下。代码被注释了,但是我得到了 INSERT INTO items (title, description, category, size) VALUES (?, ?, ?, ?) 'ssss', $fields[0][1], $fields[1][1], $fields[2][1], $fields[3][1
我试图从一个表单中获取所有输入,并将它们放入数据库。我现在不是100%确定这是否可行,但我想我会把它贴出来确认一下。代码被注释了,但是我得到了
INSERT INTO items (title, description, category, size) VALUES (?, ?, ?, ?)
'ssss', $fields[0][1], $fields[1][1], $fields[2][1], $fields[3][1]
Warning: Wrong parameter count for mysqli_stmt::bind_param()
我猜这是因为我传递的是变量,而不是它的值。但即使我通过了它的值,它是否是好代码对我来说也是个疑问
// $fields[x][0] is title of x, $fields[x][1] is value of x
$statement = 'INSERT INTO items (';
// Add all the field names
for ($i = 0; $i < count($fields) - 1; $i++) {
$statement .= $fields[$i][0] . ', ';
}
$statement = $statement . $fields[count($fields) - 1][0] . ') VALUES (';
// Add '?' for every field
for ($i = 0; $i < count($fields) - 1; $i++) {
$statement .= '?, ';
}
$statement = $statement . '?)';
echo $statement . '<br />';
// Add all the value types to the statement
$params = '\'';
for ($i = 0; $i < count($fields); $i++) {
if (gettype($fields[$i][1]) == 'integer') {
$params .= 'i';
} else {
$params .= 's';
}
}
$params .= '\', ';
// Put the values into the statement
for ($i = 0; $i < count($fields) - 1; $i++) {
$params .= '$fields[' . $i . '][1], ';
}
$i = count($fields) - 1;
$params .= '$fields[' . $i . '][1]';
echo $params;
// Put it all in the database
$db = mysqlConnect();
$stmt = $db->stmt_init();
$stmt->prepare($statement);
$stmt->bind_param($params);
$stmt->close();
$db->close();
/$fields[x][0]是x的标题,$fields[x][1]是x的值
$statement='插入项目(';
//添加所有字段名
对于($i=0;$i ;
//将所有值类型添加到语句中
$params='\'';
对于($i=0;$istmt_init();
$stmt->prepare($statement);
$stmt->bind_param($params);
$stmt->close();
$db->close();
来自:
bool mysqli_stmt::bind_参数(字符串$types,mixed&$var1[,mixed&$…])
参数必须作为单个参数传递。来自PHP手册中的bind_param:(http://php.net/manual/en/mysqli-stmt.bind-param.php) 你在打电话吗
$stmt->bind_param($params);
因此,您应该将类型放在单独的变量中,而不是$params中,并按如下方式调用它:
$stmt->bind_param($types,$params);
请记住,总的来说,这对我来说是个坏主意。由于items表有一个特定的模式,您可能应该有一个硬编码的query和types变量,只需将值以所需的格式放入params数组
您将拥有更干净的代码,并且不必处理格式错误的字段数组。我认为这将是我将得到的响应,因此我必须坚持常规查询。我确实知道将其作为参数传递,我只是想有一种方法可以用它的值替换
$params
(因此它工作正常,ish)。
$stmt->bind_param($types,$params);