Я работаю над приложением, использующим объект PHP, ориентированный на PDO. Я часами пытался найти причину сбоя при выполнении моего запроса. Оказалось, что я поставил значение в качестве параметра в формате String для привязки в массиве. У меня есть общий цикл, который связывает все параметры с заполнителем вопросительного знака для моего запроса. Это, конечно, будет учитывать параметры в формате String. Однако у меня есть столбцы в целочисленном формате. Даже когда я приведу переменную к целому числу, используя (int)
или же intval()
, это не работает. Так что я считаю, что я должен указать явный тип данных PDO::PDO_PARAM_INT
, Но у меня есть код примерно так для всех запросов:
Пример запроса:
$this->db->query("INSERT INTO users (name, numberOfCar") VALUES (?,?) ,
array('Jake', 5));
Часть bindValue ():
$x = 1;
if( count($params) ){
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}
Как мне пойти с этим? Я имею в виду любую идею, как я могу изменить код для решения этой проблемы? Не уверен, должен ли я изменять какую часть кода, но я озадачен, чтобы обойти это. Заранее спасибо.
РЕДАКТИРОВАТЬ: PHP версии 5.3.10, PDO подключиться к Sybase
Я не могу воспроизвести проблему, используя php 5.6.3, mysql5.6, win32
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);
$stmt = $pdo->prepare("INSERT INTO soFoo_users (name, numberOfCar) VALUES (?,?)");
foreach( array('Jake', 5) as $i=>$v) {
$stmt->bindValue($i+1, $v);
}
$stmt->execute();
$stmt = null;
foreach($pdo->query('SELECT * FROM soFoo_users', PDO::FETCH_ASSOC) as $r ) {
echo join(', ', $r), "\r\n";
}
function setup($pdo) {
$pdo->exec('
CREATE TEMPORARY TABLE soFoo_users (
name varchar(32),
numberOfCar int
)
');
}
печать
Jake, 5
как и ожидалось
Кажется, мне все еще нужно указать явный тип данных. Поэтому я придумаю собственное решение. Вот как я это сделал:
$this->db->query("INSERT INTO users (name, numberOfCar") VALUES (?,?) ,
array('Jake', 5),
array(PDO::PARAM_STR, PDO::PARAM_INT));
Для привязки значения:
$x = 1;
if( count($params) ){
foreach($params as $param){
$this->_query->bindValue($x, $param, $datatypes[$x-1]);
$x++;
}
}
Я надеюсь, что это может помочь кому-то, если у кого-то есть такая проблема. Большое спасибо тем, кто помог мне в этом.