我正在使用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';
}
尝试先打印这些变量 $date1
和 $date2
然后使用 mysql_query
执行它。 查看它正在打印的内容 如果与数据库存在某种格式不匹配,请进行更改。 也许这可能是唯一的原因。除了这个建议:您可以做很多事情来调试您的问题。打印您正在执行的实际查询。复制它并在phpmyadmin中执行它。
作为引用,http://php.net/manual/en/function.mysql-fetch-array.php mysql_fetch_array返回一个与读取的行对应的数组,并将内部数据指针向前移动。因此,请确保您在mysql_num行之前没有使用它。
如果使用 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" );
?>
因此,事实证明不存在竞争条件,并且几乎不需要针对此"问题"提出的每个解决方案。
祝你好运