我生成SQL语句的代码运行良好,但在为$stmt->bind_param()
生成字符串时遇到了问题。代码如下:
$stmt = $mysqli->stmt_init();
if ($stmt->prepare ($sql)) {
$bind_types = '"';
$bind_values = '';
if ($action == 'insert' || $action == 'update') {
reset ($array);
foreach ($array as $key => $value) {
if (is_string ($value)) { $type = 's'; } else if (is_int ($value)) { $type = 'i'; } else if (is_float ($value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $key . ' => ' . $value . ''); }
$bind_types .= $type;
$bind_values .= $value . ', ';
//$stmt->bind_param ($type, $value);
}
}
if ($action == 'update' || $action == 'delete') {
if (is_string ($id_value)) { $type = 's'; } else if (is_int ($id_value)) { $type = 'i'; } else if (is_float ($id_value)) { $type = 'd'; } else { die ('Cannot determine type for ' . $id_column . ' => ' . $id_value . ''); }
$bind_types .= $type;
$bind_values .= $id_value . ', ';
//$stmt->bind_param ($type, $id_value);
}
$bind_types .= '"';
$bind_values = substr ($bind_values, 0, -2);
echo $bind_types . ', ' . $bind_values;
$stmt->bind_param ($bind_types, $bind_values);
$stmt->execute();
}
它的格式搞砸了。如果很难阅读,我深表歉意。
我得到以下错误:
"警告:mysqli_stmt::bind_param()[mysqli stmt.bind-param]:类型定义字符串中的元素数与中的绑定变量数不匹配"
有什么想法吗?
我强烈建议您使用PDO,因为您可以很容易地做到这一点。如果你想在mysqli中实现,它会更复杂,因为你不能轻松地动态绑定它们。要动态绑定它们,请查看这个丑陋的破解
$bind_values= explode(',', $bind_values);
call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bind_values));
$stmt->execute();
function makeValuesReferenced(&$arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
您对bind_param
的调用是错误的:它应该是:
bind_param($types, $value1, $value2, $value3 ...);
其中这些值中的每一个都是实际变量。