我有问题使用PHP OOP将数据INSERT到mysql。
所以,这是我的代码:
public function insert($setType, $setTable, $setRow, $setValues) {
$change = function($values) {
return "?";
};
$row = join(",", $setRow);
$done = join(",", array_map($change, $setValues));
$values[] = join(",", $setValues);
function SqlArrayReferenceValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) {
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
$insert = $this->connect->prepare("INSERT INTO $setTable ($row) VALUES ($done)");
$mergedValues = array_merge(array($setType), $values);
call_user_func_array(array($insert, "bind_param"), SqlArrayReferenceValues($mergedValues));
$insert->execute();
$insert->close();
return $insert;
}
if (empty($_SESSION['transaction'])) :
$idt = date("ymdhis");
$_SESSION['transaction'] = $idt;
endif;
$st = $_SESSION['transaction'];
if (isset($_SESSION['email'])) :
$se = $_SESSION['email'];
$user = $objMysql->query(array("*"), "user", "email = '$se'");
$dataUser = $objMysql->fetch($user);
$ide = $dataUser['id_user'];
else :
$ide = 0;
endif;
$currentLink = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$objMysql->insert("sis", "url", array("id_transaction", "id_user", "url"), array("$st", "$ide", "$currentLink"));
这是我的mysql表: id_transaction行 - 类型varchar。 id_user行 - 输入INT url row - type text
我有1个错误,
- mysqli_stmt :: bind_param():类型定义字符串中的元素数量与
中的绑定变量数量不匹配 醇>
我的代码出了什么问题?
马丁的最终解决方案
public function SqlArrayReferenceValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) {
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
public function insert($setType, $setTable, $setRow, $setValues) {
$change = function($values) {
return "?";
};
$row = join(",", $setRow);
$done = join(",", array_map($change, $setValues));
$insert = $this->connect->prepare("INSERT INTO $setTable ($row) VALUES ($done)");
$params = $setValues;
$ww = array_merge(array($setType), $params);
call_user_func_array(array($insert, "bind_param"), $this->SqlArrayReferenceValues($ww));
$insert->execute();
$insert->close();
return $insert;
}
答案 0 :(得分:2)
正如Mark Baker和bub在评论中正确指出的那样,您在string
值的位置传递array
值。
您拥有的是一组值,然后您将其转换为字符串,然后再尝试将它们用作数组。 join
变量不需要使用$values
。
//$values = join(",", $setValues); // comment out this line,
call_user_func_array(array($insert, "bind_param"), array_unshift(array($setType), $setValues));
在这里,您使用array_unshift
在数组的 start 处插入传递给函数的数组TYPES。现在,这将为您提供一个插入bind_param的正确数组:
array("sis", $st, $side, $currentLink);
以上问题是MySQLi OOP代码期望对象作为引用,以及上述 - 值需要通过一个单独的进程运行,以便为{{1}提供它们的“真实”值功能。
在您的课程/脚本中添加:
call_user_func_array()
此函数获取值并将正确的值类型返回给call_user_array_function。
这样:
private function SqlArrayReferenceValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) {
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
我从Stack Overflow上的某个地方获得了这个代码,它已经很多年了!这是链接:https://stackoverflow.com/a/16120923/3536236
您的代码应该的样子:
$mergedValues = array_unshift($setValues, $setType);
call_user_func_array(array($insert, "bind_param"), $this->SqlArrayReferenceValues($mergedValues));