2

У меня проблема с моим классом базы данных. У меня есть метод, который принимает один подготовленный оператор и любое количество параметров, связывает их с оператором, выполняет оператор и форматирует результат в многомерном массиве. Everthing отлично работает, пока я не попытаюсь включить адрес электронной почты в один из параметров. Письмо содержит символ @, и, похоже, он все сломает. Когда я поставляю с параметрами:Невозможно связать строку, содержащую @ char, с mysqli_stmt_bind_param

$types = "ss" and $parameters = array("[email protected]", "testtest") 

Я получаю ошибку:

Warning: Parameter 3 to mysqli_stmt_bind_param() expected to be a reference, value given in ...db/Database.class.php on line 63

Вот метод:

private function bindAndExecutePreparedStatement(&$statement, $parameters, $types) { 
    if(!empty($parameters)) { 
     call_user_func_array('mysqli_stmt_bind_param', array_merge(array($statement, $types), &$parameters)); 
     /*foreach($parameters as $key => $value) { 
      mysqli_stmt_bind_param($statement, 's', $value); 
     }*/ 
    } 

    $result = array(); 

    $statement->execute() or debugLog("Database error: ".$statement->error); 

    $rows = array(); 

    if($this->stmt_bind_assoc($statement, $row)) { 
     while($statement->fetch()) { 
      $copied_row = array(); 
      foreach($row as $key => $value) { 
       if($value !== null && mb_substr($value, 0, 1, "UTF-8") == NESTED) { // If value has a nested result inside 
        $value = mb_substr($value, 1, mb_strlen($value, "UTF-8") - 1, "UTF-8"); 
        $value = $this->parse_nested_result_value($value); 
       } 
       $copied_row[$ke<y] = $value; 
      } 
      $rows[] = $copied_row; 
     } 
    } 

    // Generate result 
    $result['rows'] = $rows; 
    $result['insert_id'] = $statement->insert_id; 
    $result['affected_rows'] = $statement->affected_rows; 
    $result['error'] = $statement->error; 

    return $result; 
} 

Я получил одно предложение, что:

the array_merge is casting parameter to string in the merge change it to &$parameters so it remains a reference

Так что я попробовал на (3-й строке метода), но это не имело никакого значения.

Как мне это сделать? Есть ли лучший способ сделать это без call_user_func_array?


обновление: я нашел менее симпатичный способ решения этого. То, что я сделал, это создать новый массив ссылок с циклом и использовать его вместо этого.

private function bindAndExecutePreparedStatement($statement, $parameters, $types) 
{ 
    if(!empty($parameters)) { 
     $parameters_references = array(); 
     foreach($parameters as $key => $parameter) { 
      $parameters_references[] = &$parameters[$key]; 
     } 
     call_user_func_array('mysqli_stmt_bind_param', 
      array_merge(array($statement, $types), $parameters_references)); 
    } 
    .... 

Я все еще заинтересован в решении этого с PDO, кажется, л, как это имеет много других функций, а также. Я просто еще не научился использовать его.

ответ

1

Я написал код привязки параметров в MySQL-адаптере Zend Framework. Я считаю, что API-интерфейс для привязки параметров для MySQLi трудно использовать. Это не массив, который должен быть ссылкой, это каждого элемента массива.

Вы можете увидеть код, который я написал в методе _execute() в этом классе: http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Db/Statement/Mysqli.php

Я рекомендую вам проверить PDO. Это намного проще в использовании. Вы можете связывать параметры, но еще проще просто передать массив значений параметров в виде массива в метод PDOStatement execute().

+0

Благодарю вас, я прошу кое-что прочитать. :-) – Tirithen

+0

я нашел менее симпатичный способ решения этого: частных функций bindAndExecutePreparedStatement ($ ПОЛОЖЕНИЯ, параметры $, $ типов) {\ п , если { $ parameters_references = массив ((пусто ($ параметров)!)); foreach ($ parameters as $ key => $ parameter) { $ parameters_references [] = & $ parameters [$ key]; } call_user_func_array ('mysqli_stmt_bind_param', array_merge (массив ($ statement, $ types), $ parameters_references)); } .... Я по-прежнему заинтересован в решении этого вопроса с помощью PDO, похоже, что он имеет много других функций. Я просто еще не научился использовать его. – Tirithen

+0

Комментарий выше получил немного грязно, но я сделал, чтобы создать новый массив ссылок с циклом и использовать его вместо этого. – Tirithen

Смежные вопросы