2014-11-18 3 views
0

Используя следующие связать несколько параметров динамически заявление:bindParam с Foreach странные результаты

$dbh = new PDO("mysql:host=localhost;dbname=name", USER, PASSWORD); 

$params = array(':date' => '2014-02-01', 
       ':amount' => 40, 
       ':type' => 1 
       ); 

$query = "INSERT INTO entry (`date`, amount, type) VALUES (:date, :amount, :type)"; 
$stmt = $dbh->prepare($query); 

foreach ($params as $param => $value) { 
    $stmt->bindParam($param, $value); 
} 

$stmt->execute() 

код работает, но вставляет следующий текст в таблицу: 0000-00-00, 1,00, 1

Что здесь происходит?

+0

Структура таблицы может быть полезна. – Pakspul

+2

попытайтесь добавить тип переменной, также как и строки (строки) и т. Д. –

+2

Попробуйте 'foreach ($ params as $ param => & $ value)' вместо 'foreach ($ params as $ param => $ value)'. См. Комментарий Вили: http://php.net/manual/en/pdostatement.bindparam.php –

ответ

1

Основано на комментарии Vili на php.netforeach ($params as $param => &$value) вместо foreach ($params as $param => $value).

Добавление переменных типов к динамически добавленным параметрам запроса требует дополнительных шагов.

BTW. Вы не определяете массив $params динамически, по крайней мере, в вашем примере кода, чтобы это могло работать. Заменить все foreach на:

$result = $stmt->execute($params); 
+0

BTW: Вы правы, но это был всего лишь минимальный пример. 'Foreach' фактически будет внутри метода. –

1

Вы пропускаете data type,

Правильный формат PDOStatement::bindParam, должен быть, как этот

$sth->bindParam(':calories', $calories, PDO::PARAM_INT); //note PDO::PARAM_INT here 

EG,

$sql = "INSERT INTO movies(filmName, 
      filmDescription, 
      filmImage, 
      filmPrice, 
      filmReview) VALUES (
      :filmName, 
      :filmDescription, 
      :filmImage, 
      :filmPrice, 
      :filmReview)"; 

$stmt = $pdo->prepare($sql); 

$stmt->bindParam(':filmName', $_POST['filmName'], PDO::PARAM_STR);  
$stmt->bindParam(':filmDescription', $_POST['filmDescription'], PDO::PARAM_STR); 
$stmt->bindParam(':filmImage', $_POST['filmImage'], PDO::PARAM_STR); 
// use PARAM_STR although a number 
$stmt->bindParam(':filmPrice', $_POST['filmPrice'], PDO::PARAM_STR); 
$stmt->bindParam(':filmReview', $_POST['filmReview'], PDO::PARAM_STR); 

$stmt->execute(); 

REFERENCE

REFERENCE 2

+0

Конечно, он работает. Комментарий ZZ-bb также работал. –

+0

@ RafaelWörner отлично, что его работа :) –

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