2015-06-07 4 views
-2

Я запрограммировал следующий PHP и MySQL:Mysql where clause bug?

$id = $_GET['id']; 
if ($stmt = $db->prepare("SELECT disco, fecha, amazon from discos where id=? LIMIT 1")) { 
    $stmt->bind_param("i", $id); /* NOTE: "s" doesn't work */ 
    $stmt->execute(); 
    $stmt->bind_result($disco, $fecha, $amazon);   
    if($stmt->fetch()){ 
     /* Do some stuff */ 
    } 
} 

Дело в том, когда значение $ ид есть, например: 100abcd, запрос все еще выбирает, в то время как он не должен, так как нет id, вызванный так, НО он извлекает идентификатор 100.

Почему это происходит? Благодарю.

+3

'-> bind_param (" i ", ...)' отличает его к целому числу. Если вы хотите оставить принудительное принуждение типа к MySQL, тогда привяжите его как строку. – mario

+0

Да, я уже имел это с «s» вместо «i», и все равно не работает. –

+0

две вещи проверяют, что '$ id' имеют какое-либо значение или не также помещают некоторое предложение ORDERBY перед' LIMIT' и проверяют. попробуйте –

ответ

4

Это неявное преобразование из строки в int - это эквивалент id = CAST ('100abcd' AS unsigned);

> SELECT CAST('100abcd' AS UNSIGNED); 
+-----------------------------+ 
| CAST('100abcd' AS UNSIGNED) | 
+-----------------------------+ 
|       100 | 
+-----------------------------+ 
+0

Да, я уже тестировал его с помощью «s» вместо «i», и все равно не работает. –

+0

Что такое «не работает»? Если вы пытаетесь проверить ввод, сделайте это в логике приложения '' 'if (! Is_numeric ($ id)) {echo 'invalid id'; Выход; } '' ' – Martin