2016-11-26 6 views
2

У меня возникла ошибка при попытке вставить несколько значений в базу данных mysql с помощью подготовленного оператора.Ошибка ввода нескольких значений с помощью подготовленного оператора с использованием php

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

Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables. 

Я думаю, что это видит $ данные в виде одного значения, я не знаю, что теперь делать

$keys = (?, ?, ?); 
    $types = "iii"; 
    $data = "1, 3, 500"; 
    if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?),$keys")) { 
    $ortype = 1;  
    $stmt2->bind_param("iii".$types, $userid, $ortype, $amount, $data); 
    $stmt2->execute(); 
    $stmt2->close(); 

    } 

ответ

-1

Я думаю, что это видит $ данные в виде одного значения

Да, конечно. Почему бы это сделать иначе, если каким-либо образом это является единственное значение?

я не знаю, что делать теперь

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

Для этого создайте массив , содержащий все данные.

$data = []; 
$data[] = $userid; 
$data[] = $ortype; 
$data[] = $amount; 
$data[] = 1; 
$data[] = 3; 
$data[] = 500; 
$count = count($data); 

затем создать строку с заполнителями

$values = implode(',', array_fill(0, $count, '(?, ?, ?)')); 

затем создать строку с типами

$types = str_repeat("iii", $count); 

и, наконец, создать запрос и выполнить его

$stmt = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES $values"); 
$stmt->bind_param($types, ...$data); 
$stmt->execute(); 
+0

Благодаря он работал .. пришлось настроить его немного ты – joshua

+0

ли это подправить о коде или только ваш собственный источник данных? Если бы первый делился, поэтому я могу исправить ответ, так как это явно набросок на месте, не проверен –

+0

нет, его о моем источнике данных – joshua

-1

Вы пытаетесь связать с переменные, но вы назначаете их вручную. В дополнение к этому, количество параметров не соответствует.

У вас есть 3 заполнителя, 3 типа-определения, но еще 4 значения. Они соотносятся друг с другом, поэтому количество определений типов (ваш iii) должно соответствовать количеству заполнителей ? и количеству значений, которые вы связываете (в порядке заполнения).

// $keys = (?, ?, ?); // Removed this, syntax error and you bind it manually anyway later 
// $types = "iii"; // You bind it manually later 
$data = "1, 3, 500"; 

// Removed ',$keys' from your query, you manually put the placeholders 
if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)")) { 
    $ortype = 1; 

    // removed '.$types' - you bind it manually 
    // Also removed $data - you have 3 values, 3 columns, not 4 
    $stmt2->bind_param("iii", $userid, $ortype, $amount); 
    $stmt2->execute(); 
    $stmt2->close(); 
} 

И да, ваш $data одно значение, а не список параметров.

В документации также содержатся хорошие примеры.

Ссылки

0

Попробуйте это логики, посмотрите, работает или нет :)

$data = array(array(1,3,5), array(2,4,6)); 
$sql = 'INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)'; 

if($stmt = $conn->prepare($sql)){ 

$stmt->bind_param("iii", $usr, $type, $amt); 

foreach ($data as $v) { 

$usr = $v[0]; 
$type = $v[1]; 
$amt = $v[2]; 

$stmt->execute(); 

if($stmt->insert_id <= 0){ 
trigger_error('Insert fail. Error: ' . $stmt->error); 
break; 
} 
} 
$stmt->close(); 
$conn->close(); 
} 
else{ 
trigger_error('Prepare fail.'); 
}