2015-06-16 2 views
0

В настоящее время я пытаюсь создать небольшую универсальную функцию для вставки. Моя цель - передать таблицу, столбцы, значения и типы, чтобы заполнить вставку.Bind Variable Количество параметров в подготовленном заявлении

Моя единственная проблема это утверждение:

$stmt -> bind_param($types, $var1, $var2 ...); 

Что я в принципе нужно будет что-то вроде этого:

$stmt -> bind_param($types, $array); 

Это то, что я получил до сих пор:

function insert($into, $columns, $values, $types) { 
    global $connection; 

    // Check Correct Length 
    if(count($columns) != count($values) || 
     count($columns) != count($types)) { 
      return false; 
     } 

    $count = count($columns); 

    $column_string = ""; 
    $value_string = ""; 
    $value_types = ""; 

    for($i = 0; $i < $count; $i++) { 
     $column_string .= $columns[$i]; 
     $value_types .= $types[$i]; 

     $value_string .= '?'; 

     if($i + 1 < $count) { 
      $column_string .= ','; 
      $value_string .= ','; 
     } 
    } 

    $sql = "INSERT INTO $into ($column_string) VALUES ($value_string)"; 

    // Execute Statement 
    if($stmt = $connection -> prepare($sql)) { 

     // $stmt -> bind_param("sss", $transaction, $email, $status); 
     // What to do here? 

     $stmt -> execute(); 

     $stmt -> close(); 
    } 

SQL-оператор уже выглядит отлично. Также типы готовы - я просто нужен способ, чтобы динамически связать параметры ...

+0

Вы не можете. 'bindparam' является отображением 1: 1. Вы можете использовать параметр array в execute(), чтобы передать все сразу. '$ stmt-> execute (array (': foo' => 'bar', ....));' –

+0

Можете ли вы дать мне дополнительную информацию об этом? Есть ли отрицательная сторона делать это так? –

+0

ну, это только помогает при выполнении запроса. если вы хотите связать значения результата, вы застряли со многими вызовами bindparam(). –

ответ

1

Ну я полагаю, что в $ колоннах определяется как $columns = array('col1', 'col2'/*...*/); и $ значения в $values = array($val1, $val2/*...*/);

Я бы создайте функцию для экранирования имен столбцов.

$escapeCols = function($column) { return sprintf('% S ', $column); };

Другая функция для создания ? заполнители

$placeholders = function ($values) { return array_fill(0, count($values), '?'); }

Вы можете чем подготовить запрос

$sql = sprintf( 'INSERT INTO %s (%s) VALUES (%s)', $table, implode(', ', array_map($escapeCols, $columns), implode(', ', $placeholders($values)) );

И тогда вы можете позвонить execute

$stmt = $connection->prepare($sql); $stmt->execute($values);

Таким образом, может быть легко преобразован, если бы $ ЗНАЧЕНИЯ определяется как

$values = array('col1' => $va1, 'col2' => $val2);

+0

Прежде всего спасибо - я попробовал это, но получил следующую ошибку: Warning: mysqli_stmt :: execute() ожидает точно 0 параметров, 1 задано в /var/www/virtual/.../helper.php в строке 126 –

+0

Oh извините, я пропустил, вы используете * mysqli *. Мой комментарий будет работать на * pdo *. У кого есть лучшие возможности. – venca

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