PHP使用call_user_func_array到bind_param

时间:2015-10-07 11:46:18

标签: php mysql

我有问题使用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个错误,

  
      
  1. mysqli_stmt :: bind_param():类型定义字符串中的元素数量与
  2. 中的绑定变量数量不匹配   

我的代码出了什么问题?

马丁的最终解决方案

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;     
    }

1 个答案:

答案 0 :(得分:2)

正如Mark Ba​​ker和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

更新3:

您的代码应该的样子:

$mergedValues = array_unshift($setValues, $setType);
call_user_func_array(array($insert, "bind_param"), $this->SqlArrayReferenceValues($mergedValues));