2017-08-28 37 views
0

参考阵列我有一个类似的问题,这样的问题作者:PHP 7.0的mysqli - 为call_user_func_array

MySQLI binding params using call_user_func_array

但我的问题得到重复的标签之前,该解决方案并没有为我工作了。

这实际上是我的代码:

// in classfoodao.php 
function updateClassfoo(Classfoo $classfoo){ 
    $values = array(); 
    global $conn,$f; 
    $pattern = ""; 
    /* updateFields get all defined attributes in classfoo object and then write in the $sql string 
    * A prepared statement only for the not null attribs, 
    * and also put the attribs in the same order in the $values array. 
    * The same are done for the $pattern string. 
    * $values and $pattern are passed by reference. 
    */ 
    $sql = $classfoo->updateFields($values, $pattern); 
    if (!empty($values) && !empty($pattern)) { 
    $stmt = $conn->prepare($sql); 
    $temp = array($pattern); 
    for ($i = 0, $count = count($values); $i < $count; $i++) { 
     $addr = &$values[$i]; 
     array_push($temp, $addr); 
    } 
    call_user_func_array(array($stmt, "bind_param"), $temp); 
    } else { 
    return true; 
    } 
} 

我仍然得到这个警告:

PHP Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given 

与错误以下:

Execute failed on update: (2031) No data supplied for parameters in prepared statement 

我没有使用任何框架对于PHP,我如何创建一个引用数组来解决这个问题?

+1

我不认为我们在这里得到完整的图片...你在哪里调用' - > bind_param()'方法 –

+0

除了@SamuelCook的建议,它将是非常有用的,看看什么'$值'是'ie和数组或字符串'以及'$ temp'是如何使用的,推测是一个bind_param调用。 – TheDude

+0

请提供您调用bind_param()的代码。否则,我们无法帮助你。 – iquellis

回答

0

我还是觉得我们这里没有全貌,但我认为这足以形成足够的答案。

听起来好像你想要一个函数,它需要一个mysqli_stmtstring和一个array,因为它是3个参数并返回一个参数化的SQL语句。在代码的方法签名看起来像

/** 
* Builds a parameterized Sql query from the provided statement, data type pattern and params array. 
* 
* @param string $stmt The query string to build a parameterized statement from 
* @param string $pattern The data type pattern for the parameters i.e. sssd for 3 strings and an interger. 
* @param array $params A sequential array of the parameters to bind to the statement. 
* 
* @return mysqli_stmt The parameter bound sql statement ready to be executed. 
*/ 
public function bind(string $stmt, string $pattern, array $params) : mysqli_stmt 

你会称这样的方法,例如

$stmt = bind(
    'INSERT INTO myTable (str_field, str_field_2, int_field) VALUES (?, ?, ?)', 
    'ssd', 
    ['val1', 'val2', 1337] 
); 
$result = $stmt->execute(); 

实现应该是微不足道,因为这

public function bind(string $stmt, string $pattern, array $params) : mysqli_stmt { 
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world'); 
    $preparedStmt = $mysqli->prepare($stmt); 
    $preparedStmt->bind_param($pattern, ...$params); 
    return $preparedStmt; 
} 

当然,我会建议每次调用函数时都使用依赖注入而不是创建新的mysqli对象,并且应该对$ pattern和$ param计数进行一些错误检查。仍然有很多我看不到,但我希望这会让你走上正轨。

+0

这是一个很好的方法,但它不适合我,因为我需要一个可以在动态环境下工作的函数来更新哪些字段。现在我刚刚做出了一个很不错的'开关盒',但我完全希望有人能帮我解决我的问题。 顺便说一句:感谢您的支持。 –

+0

您能否提供示例输入和输出以演示所需的行为? – TheDude