PHP和MySQLi - 错误查询并且没有错误
问题描述:
以下代码执行错误查询。输入数据显然是错误的。即使有这些错误,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?
答
事情是2013-02-0'
和2013-02-"
是有效的MySQL日期字符串。 2013-02-0'
评估为2012-02-00
和2013-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
答
你所拥有的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
为什么要这个报告错误?你查询的数据,你没有得到任何。就是这样,你的查询仍然有效。 – Oliver 2013-03-08 16:19:57