PHP: PDOStatement простой MySQL Select не работает - PullRequest
1 голос
/ 24 марта 2010

У меня следующий код PHP, делающий очень простое выделение в таблицу.

$statement = $db->prepare("SELECT * FROM account WHERE fbid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
print_r($out) // 1;
//$out = $statement->execute(array(':fbid' => $uid)); // also doesn't work
$row = $statement->fetch();

$out верно (успех), но $row равно нулю.

EDIT:

$statement->debugDumpParams();

Выходы

SQL: [40] SELECT * FROM account WHERE fbid = :fbid Params: 1 Key: Name: [5] :fbid paramno=-1 name=[5] ":fbid" is_param=1 param_type=2

Если я изменю код следующим образом:

$statement = $db->prepare("SELECT * FROM account WHERE fbid = $uid");
$out = $statement->execute();
$row = $statement->fetch();

$row содержит ожидаемую запись.

Я в растерянности. Я использую PDO :: prepare (), bindParams () и т. Д. Для защиты от SQL-инъекций (возможно, я ошибаюсь).

EDIT: В моем примере $ uid является числовой строкой (то есть строкой, содержащей только цифры). В базе данных тип столбца VARCHAR (45)

EDIT:

Если я изменю тип базы данных с VARCHAR (45) на BIGINT, оба запроса будут работать. Если я снова изменю тип в типе базы данных обратно на VARCHAR (45), это сработает. Так что же дает

Пожалуйста, помогите.

Ответы [ 5 ]

1 голос
/ 05 апреля 2010

Вам необходимо проверить значение fbid. он всегда должен быть строкой, если его целочисленное значение больше 2 ^ 32 (без знака), просто приведение к (строка) $ uid не работает, а sprintf ("%. 0f", ...) будет работать только тогда, когда целочисленное значение меньше 2 ^ 52, потому что в 32-битной ОС, когда число больше 2 ^ 31 (32 без знака), PHP будет предполагать, что это двойной тип, а точность по умолчанию - только 14 десятичных, а fbid - 20.

Вы должны хранить fbid в строке, содержащей только [0-9] в PHP, независимо от того, хранится ли она как BIGINT или VARCHAR в MySQL, MySQL принимает только строковый оператор sql и всегда возвращает результат в строковом формате.

$mi = new mysqli("localhost", "root", "xxx", "test");
$uid = "12379739851403943597";   // Works
//$uid = 12379739851403943597;   // never Works
//$uid = (string) 12379739851403943597;   // get "1.2379739851404E+19" wrong string !
//$suid = sprintf("%.0f", $uid);          // get "12379739851403943936" lost precise

$stmt = $mi->prepare("select * from bitest where id = ?");
$stmt->bind_param('s', $uid);

$stmt->execute();
$stmt->bind_result($id, $name);

$stmt->store_result();
print "numrow: " . $stmt->num_rows . " - \n";
$stmt->fetch();
print "$id - $name \n";
$stmt->free_result();

$stmt->close();


$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'xxx');
$sql = "select * from bitest where id = ?";

$sth = $pdo->prepare($sql);
$sth->bindParam(1, $uid, PDO::PARAM_STR);

$sth->execute();
var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
0 голосов
/ 24 марта 2010

Я думаю, что может быть проблема с вашей установкой PDO.

<code>$uid = 552192373; // my facebook uid for testing
$statement = $db->prepare("SELECT * FROM users WHERE facebook_uid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo '<pre>';
print_r($row);
echo '
';

возвращается:

Array
(
    [id] => 1
    [facebook_name] => Jason Boehm
    [facebook_uid] => 552192373
)
0 голосов
/ 24 марта 2010

Попробуйте сбросить дополнительный параметр,

$statement->bindParam (":fbid", $uid, PDO::PARAM_STR);

(редактирование) Вы на 100% уверены, что вокруг UID нет лишних пробелов? Проверка с trim() и передача по значению:

$statement->bindValue (":fbid", trim($uid), PDO::PARAM_STR);
0 голосов
/ 24 марта 2010

Возможно, попробуйте PDO :: PARAM_INT

Кроме того, имейте в виду, что bindParam () принимает переменную в качестве ссылки. Возможно, ваш демонстрационный код не показывает изменение значения этой переменной перед вызовом execute (). При необходимости смотрите bindValue ().

0 голосов
/ 24 марта 2010

Прошло много времени ... попробуйте передать хеш вместо :

$statement->execute(array( 'fbid' => $uid ));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...