2016-09-19 3 views
1

Я работаю впервые с подготовленными инструкциями, но я застрял в этой ошибке. По какой-то причине я не могу передать типы привязок в качестве параметра?Проблемы при привязке значений

Мой код:

function insert($table, $columns = array(), $bindTypes, $values = array()) { 
// Store connection. 
$connection = connection(); 
$columnValues = null; 
$index = 1; 

// Prepare unassigned value string. 
foreach ($columns as $column) { 
    $columnValues .= '?'; 
    if ($index < count($columns)) { 
     $columnValues .= ', '; 
    } 
    $index++; 
} 

// Debugg purpose: echo query example: 
echo "INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})"; 

// Prepare statement. 
$statement = $connection->prepare("INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})"); 
$statement->bind_param($bindTypes, implode(', ', $values)); 
} 


insert('test', array('name'), 'i', array(1)); 

Если я эхо пример запроса я получаю "INSERT INTO тест (имя) VALUES (?)".

Пожалуйста, пощадите меня, я все еще изучаю noob.

ответ

1

PHP> 5,6 версия:

function insert($connection, $table, $columns, $values) { 
    $columnStr = "`".implode("`,`",$columns); 
    $valueStr = str_repeat('?,', count($values) - 1) . '?'; 
    $types = str_repeat('s', count($values)); 
    $statement = $connection->prepare("INSERT INTO `$table` ($columnStr) VALUES ($valueStr)"); 
    $statement->bind_param($types, ...$values); 
    $statement->execute(); 
} 

insert($conn, 'test', ['name'], [1]); 

Обратите внимание, что вы никогда не должны когда-нибудь имена таблиц или столбцов из пользовательского ввода, но всегда их жестко закодированы в сценарии. Что делает отличную функцию для вставки совершенно бесполезной.

+0

Примечание: PHP/5.6 + требуется из-за синтаксиса [... $ values] (http://php.net/functions.arguments#functions.variable-arg-list). –

0

Я вижу, что вы отметили свое сообщение с MySQLi, и я уверен, что здесь проблема.

Вместо этого я бы пошел с PDO на этом, так как он позволяет использовать переменное количество параметров намного проще. Позвольте вам сделать что-то очень похожее на example 5 из руководства по PHP.

1

Давайте посмотрим на the docs:

BOOL mysqli_stmt :: bind_param (строка $ типы, смешанные & $ var1 [, смешанные & $ ...])

Другими словами, первый аргумент определяет типы данных, и вы передаете значения как индивидуальные параметры, начиная со второго параметра. Однако у вас есть это:

$statement->bind_param($bindTypes, implode(', ', $values)); 

Вы комбинируя все индивидуальные значения в одну строку, разделенную запятыми, который не делает ни малейшего смысла, особ. если вы считаете, что функция ожидает аргументов справка.

+0

Спасибо. Я вижу проблему сейчас, хотя я не могу найти решение. –

+0

@ DennisCastelijns, какую версию PHP вы используете? –

+0

@YourCommonSense 5.5.9 –