我正在使用mysql_query()
函数在php中运行查询,但它返回零行,而当我在phpMyAdmin中运行相同的查询时,我得到一行。不知道是什么造成了错误。我在sqlfiddle上使用查询
SELECT * FROM cart_discount
WHERE email_counter < 1 AND
cart_time BETWEEN '2013-01-31 00:00:00' AND '2013-02-01 23:59:59'
http://sqlfiddle.com/#!2/cceb7/4
请指导php制造麻烦的地方..
这是生成和执行查询的方式。
$date1 = date('Y-m-d 00:00:00', strtotime(' -1 day'));
$date2 = date("Y-m-d 23:59:59");
$query = "SELECT *
FROM cart_discount
WHERE email_counter < 1
AND cart_time >= '$date1'
AND cart_time <= '$date2'";
$ssql = mysql_query($query, $con) or die('Problem running query: ' . mysql_error());
if (mysql_num_rows($ssql) > 0) {
//do something
} else {
echo 'No rows found';
}
答案 0 :(得分:0)
尝试首先打印这些变量$date1
&amp;在使用$date2
执行之前mysql_query
。如果某些格式与数据库不匹配,请查看打印内容然后更改它。也许这可能是唯一的原因。除了建议:
你可以做很多事情来调试你的问题。打印实际查询您正在执行的内容。复制它并在phpmyadmin中执行它。比较差异。
答案 1 :(得分:0)
作为http://php.net/manual/en/function.mysql-fetch-array.php的引用,mysql_fetch_array返回一个与获取的行对应的数组,并将内部数据指针向前移动。所以请确保在mysql_num-rows之前没有使用它。
如果使用mysql_unbuffered_query(),则mysql_num_rows()将不会返回正确的值,直到检索到结果集中的所有行为止。
警告:: mysql_num_rows()
自PHP 5.5.0起,此扩展程序已弃用,将来将被删除。相反,应该使用MySQLi或PDO_MySQL扩展。另请参阅MySQL:选择API指南和相关的常见问题解答以获取更多信息。该功能的替代方案包括:
mysqli_stmt_num_rows()
PDOStatement::rowCount()
使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()不会在MySQL上触发竞争条件,因为这几乎无法完全违背其目的。
它们的使用结果实际上是每个连接会话唯一的,因为进程不可能在PHP中共享任何内容。就PHP而言,每个请求代表一个与MySQL的新连接,因为每个请求都与其自己的进程隔离。
要模拟此操作,请创建以下脚本:
<?php
$Handle = mysql_connect( "localhost" , "root" , "" );
mysql_select_db( "lls" );
if( isset( $_GET[ 'Sleep' ] ) ) {
mysql_query( "SELECT SQL_CALC_FOUND_ROWS `bid` From `blocks` Limit 1" );
} else {
mysql_query( "SELECT SQL_CALC_FOUND_ROWS `aid` From `access` Limit 1" );
}
if( isset( $_GET[ 'Sleep' ] ) ) {
sleep( 10 ); // Simulate another HTTP request coming in.
$Result = mysql_query( "SELECT FOUND_ROWS( )" );
print_r( mysql_fetch_array( $Result ) );
}
mysql_close( );
?>
设置与您的环境匹配的内容的连接和查询信息。
使用Sleep查询字符串运行一次脚本,不用它再次运行脚本。同时运行它们很重要。使用Apache ab或类似的东西,甚至更简单,只需打开两个浏览器选项卡。例如:
http://localhost/Script.php?Sleep=10
http://localhost/Script.php
如果存在竞争条件,则脚本的第一个实例的结果将等于脚本的第二个实例的结果。
例如,脚本的第二个实例将执行以下SQL查询:
<?php
mysql_query( "SELECT SQL_CALC_FOUND_ROWS `aid` From `access` Limit 1" );
?>
当脚本的第一个实例正在休眠时,会发生这种情况。如果存在竞争条件,当脚本的第一个实例唤醒时,它执行的FOUND_ROWS()的结果应该是SQL查询中执行脚本的第二个实例的行数。
但是当你运行它们时,情况并非如此。脚本的第一个实例返回其OWN查询的行数,即:
<?php
mysql_query( "SELECT SQL_CALC_FOUND_ROWS `bid` From `blocks` Limit 1" );
?>
因此事实证明不存在任何竞争条件,并且几乎不需要用于解决这个“问题”的每个解决方案。
祝你好运,