猿问

如何在PHP中动态绑定mysqli bind_param参数?

如何在PHP中动态绑定mysqli bind_param参数?

我一直在学习为我的sql查询使用预备语句和绑定语句,到目前为止我已经提出了这个问题,它可以正常工作但是当涉及到多个参数或者当不需要参数时,它根本不是动态的,

public function get_result($sql,$parameter)
    {
        # create a prepared statement
    $stmt = $this->mysqli->prepare($sql);

        # bind parameters for markers
    # but this is not dynamic enough...
        $stmt->bind_param("s", $parameter);

        # execute query 
        $stmt->execute();

    # these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
        $meta = $stmt->result_metadata(); 

        while ($field = $meta->fetch_field()) { 
            $var = $field->name; 
            $$var = null; 
            $parameters[$field->name] = &$$var; 
        }

        call_user_func_array(array($stmt, 'bind_result'), $parameters); 

        while($stmt->fetch()) 
        { 
            return $parameters;
            //print_r($parameters);      
        }


        # close statement
        $stmt->close();
    }

这就是我调用对象类的方式,

$mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME);$output = new search($mysqli);

有时候我不需要传递任何参数,

$sql = "
SELECT *
FROM root_contacts_cfm
";print_r($output->get_result($sql));

有时我只需要一个参数,

$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
ORDER BY cnt_id DESC
";print_r($output->get_result($sql,'1'));

有时我只需要一个以上的参数,

$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
AND root_contacts_cfm.cnt_firstname = ?
ORDER BY cnt_id DESC
";print_r($output->get_result($sql,'1','Tk'));

所以,我认为这条线对于上面的动态任务来说不够动态,

$stmt->bind_param("s", $parameter);

要动态构建bind_param,我在其他帖子上发现了这一点。

call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params);

我试图从php.net修改一些代码,但我无处可去,

if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ 
    { 
        $refs = array(); 
        foreach($arr as $key => $value) 
            $array_of_param[$key] = &$arr[$key]; 

       call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params);

     }

为什么?任何想法我怎么能让它工作?

或者也许有更好的解决方案?


互换的青春
浏览 1128回答 3
3回答

桃花长相依

找到了mysqli的答案:public&nbsp;function&nbsp;get_result($sql,$types&nbsp;=&nbsp;null,$params&nbsp;=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;create&nbsp;a&nbsp;prepared&nbsp;statement &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt&nbsp;=&nbsp;$this->mysqli->prepare($sql); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;bind&nbsp;parameters&nbsp;for&nbsp;markers &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;but&nbsp;this&nbsp;is&nbsp;not&nbsp;dynamic&nbsp;enough... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$stmt->bind_param("s",&nbsp;$parameter); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($types&&$params) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$bind_names[]&nbsp;=&nbsp;$types; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($i=0;&nbsp;$i<count($params);$i++)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$bind_name&nbsp;=&nbsp;'bind'&nbsp;.&nbsp;$i; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$$bind_name&nbsp;=&nbsp;$params[$i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$bind_names[]&nbsp;=&nbsp;&$$bind_name; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$return&nbsp;=&nbsp;call_user_func_array(array($stmt,'bind_param'),$bind_names); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;execute&nbsp;query&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt->execute(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;these&nbsp;lines&nbsp;of&nbsp;code&nbsp;below&nbsp;return&nbsp;one&nbsp;dimentional&nbsp;array,&nbsp;similar&nbsp;to&nbsp;mysqli::fetch_assoc() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$meta&nbsp;=&nbsp;$stmt->result_metadata();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;($field&nbsp;=&nbsp;$meta->fetch_field())&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$var&nbsp;=&nbsp;$field->name;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$$var&nbsp;=&nbsp;null;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parameters[$field->name]&nbsp;=&nbsp;&$$var;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call_user_func_array(array($stmt,&nbsp;'bind_result'),&nbsp;$parameters);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while($stmt->fetch())&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$parameters; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//print_r($parameters);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;the&nbsp;commented&nbsp;lines&nbsp;below&nbsp;will&nbsp;return&nbsp;values&nbsp;but&nbsp;not&nbsp;arrays &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;bind&nbsp;result&nbsp;variables &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$stmt->bind_result($id);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;fetch&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$stmt->fetch();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;return&nbsp;the&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;$id;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;close&nbsp;statement &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt->close(); &nbsp;&nbsp;&nbsp;&nbsp;}然后:$mysqli&nbsp;=&nbsp;new&nbsp;database(DB_HOST,DB_USER,DB_PASS,DB_NAME);$output&nbsp;=&nbsp;new&nbsp;search($mysqli);$sql&nbsp;=&nbsp;" SELECT&nbsp;* FROM&nbsp;root_contacts_cfm ORDER&nbsp;BY&nbsp;cnt_id&nbsp;DESC ";print_r($output->get_result($sql));$sql&nbsp;=&nbsp;" SELECT&nbsp;* FROM&nbsp;root_contacts_cfm WHERE&nbsp;root_contacts_cfm.cnt_id&nbsp;=&nbsp;? ORDER&nbsp;BY&nbsp;cnt_id&nbsp;DESC ";print_r($output->get_result($sql,'s',array('1')));$sql&nbsp;=&nbsp;" SELECT&nbsp;* FROM&nbsp;root_contacts_cfm WHERE&nbsp;root_contacts_cfm.cnt_id&nbsp;=&nbsp;? AND&nbsp;root_contacts_cfm.cnt_firstname&nbsp;=&nbsp;? ORDER&nbsp;BY&nbsp;cnt_id&nbsp;DESC ";print_r($output->get_result($sql,&nbsp;'ss',array('1','Tk')));mysqli在谈到这个时是如此蹩脚。我想我应该迁移到PDO!

慕容3067478

使用PHP 5.6可以在解包operator(...$var)的帮助下轻松完成,并使用bind_result()的get_result()public&nbsp;function&nbsp;get_result($sql,$types&nbsp;=&nbsp;null,$params&nbsp;=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$stmt&nbsp;=&nbsp;$this->mysqli->prepare($sql); &nbsp;&nbsp;&nbsp;&nbsp;$stmt->bind_param($types,&nbsp;...$params); &nbsp;&nbsp;&nbsp;&nbsp;if(!$stmt->execute())&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$stmt->get_result();}例:$mysqli&nbsp;=&nbsp;new&nbsp;database(DB_HOST,DB_USER,DB_PASS,DB_NAME);$output&nbsp;=&nbsp;new&nbsp;search($mysqli);$sql&nbsp;=&nbsp;"SELECT&nbsp;*&nbsp;FROM&nbsp;root_contacts_cfm&nbsp;WHERE&nbsp;root_contacts_cfm.cnt_id&nbsp;=&nbsp;? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;root_contacts_cfm.cnt_firstname&nbsp;=&nbsp;? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;cnt_id&nbsp;DESC";$res&nbsp;=&nbsp;$output->get_result($sql,&nbsp;'ss',array('1','Tk'));while($row&nbsp;=&nbsp;res->fetch_assoc()){ &nbsp;&nbsp;&nbsp;echo&nbsp;$row['fieldName']&nbsp;.'<br>';}

交互式爱情

或者也许有更好的解决方案?这个答案对你没什么帮助,但是你应该认真考虑从mysqli&nbsp;切换到PDO。这样做的主要原因是PDO通过内置函数完成了你在mysqli中尝试做的事情。除了具有手动param绑定之外,execute方法还可以使用一组参数。PDO很容易扩展,并且添加方便的方法来获取所有东西和返回而不是做准备 - 执行舞蹈是非常容易的。
随时随地看视频慕课网APP
我要回答