2013-03-08 96 views
0

以下代码执行错误查询。输入数据显然是错误的。即使有这些错误,MySQLi也不会报告错误。PHP和MySQLi - 错误查询并且没有错误

<?php 
$mysqli = new MySQLi('hostname', 'username', 'password', 'databasename'); 
$sql = ' 
SELECT 
    ID_ASSOCIADO 
FROM 
    MOVIMENTO 
WHERE 
    DATA_MOVIMENTO BETWEEN ? AND ? 
'; 
$mysqliStmt = $mysqli->prepare($sql); 
$dataInicial = "2013-02-0'"; // Malformed date. 
$dataFinal = '2013-02-"'; // Another one. 
$mysqliStmt->bind_param('ss', $dataInicial, $dataFinal); 
$mysqliStmt->execute(); 
$mysqliStmt->bind_result($idAssociado); 
while ($mysqliStmt->fetch()) { 
    echo 'ID ASSOCIADO: ' . $idAssociado . PHP_EOL; 
} 
?> 

的准备调用后的mysqli对象:

mysqli Object 
(
    [affected_rows] => -1 
    [client_info] => 5.5.29 
    [client_version] => 50529 
    [connect_errno] => 0 
    [connect_error] => 
    [errno] => 0 
    [error] => 
    [error_list] => Array 
     (
     ) 

    [field_count] => 0 
    [host_info] => Localhost via UNIX socket 
    [info] => 
    [insert_id] => 0 
    [server_info] => 5.5.28-1 
    [server_version] => 50528 
    [stat] => Uptime: 9651 Threads: 1 Questions: 1947 Slow queries: 0 Opens: 1433 Flush tables: 1 Open tables: 340 Queries per second avg: 0.201 
    [sqlstate] => 00000 
    [protocol_version] => 10 
    [thread_id] => 481 
    [warning_count] => 0 
) 

mysqli的对象执行调用后:

mysqli Object 
(
    [affected_rows] => -1 
    [client_info] => 5.5.29 
    [client_version] => 50529 
    [connect_errno] => 0 
    [connect_error] => 
    [errno] => 0 
    [error] => 
    [error_list] => Array 
     (
     ) 

    [field_count] => 1 
    [host_info] => Localhost via UNIX socket 
    [info] => 
    [insert_id] => 0 
    [server_info] => 5.5.28-1 
    [server_version] => 50528 
    [stat] => Commands out of sync; you can't run this command now 
    [sqlstate] => HY000 
    [protocol_version] => 10 
    [thread_id] => 481 
    [warning_count] => 0 
) 

我必须把错误在库MySQLi像PDO?

+0

为什么要这个报告错误?你查询的数据,你没有得到任何。就是这样,你的查询仍然有效。 – Oliver 2013-03-08 16:19:57

回答

1

事情是2013-02-0'2013-02-"是有效的MySQL日期字符串。 2013-02-0'评估为2012-02-002013-02-"评估为NULL,但仍然可以与NULL比较,因此该查询实际上不是无效的。

mysql> SELECT DATE("2012-02-0'"); 
+--------------------+ 
| DATE("2012-02-0'") | 
+--------------------+ 
| 2012-02-00   | 
+--------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT DATE('2012-02-"'); 
+-------------------+ 
| DATE('2012-02-"') | 
+-------------------+ 
| NULL    | 
+-------------------+ 
1 row in set, 1 warning (0.03 sec) 


mysql> SELECT '2012-02-00' BETWEEN "2013-02-'" AND '2013-02-0"'; 
+---------------------------------------------------+ 
| '2012-02-00' BETWEEN "2013-02-'" AND '2013-02-0"' | 
+---------------------------------------------------+ 
|             0 | 
+---------------------------------------------------+ 
1 row in set (0.00 sec) 
+0

我现在没有例子,但是我得到的结果格式不正确...我会尝试再次重现奇怪行为,然后更新我的问题。谢谢。 – 2013-03-08 16:26:18

1

你所拥有的mysqli检查错误的方式与旧版本的MySQL

$mysqliStmt = $mysqli->prepare($sql) or trigger_error($mysqli->error); 
$mysqliStmt->bind_param('ss', $dataInicial, $dataFinal) or trigger_error($mysqli->error); 
$mysqliStmt->execute() or trigger_error($mysqli->error); 

等相同。
所以,只是退出不可用的mysqli和使用PDO