4

我正在使用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';
}
4

2 回答 2

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" );

?>

所以事实证明不存在竞争条件,并且几乎不需要为解决这个“问题”而提出的每个解决方案。

祝你好运,

于 2013-02-01T11:31:09.913 回答
0

尝试先打印这些变量$date1$date2然后再使用mysql_query. 如果与数据库存在某种格式不匹配,请查看它正在打印什么,然后更改它。也许这可能是唯一的原因。除了这个建议: 你可以做很多事情来调试你的问题。打印您正在执行的实际查询。复制它并在 phpmyadmin 中执行它。比较差异。

于 2013-02-01T11:00:57.783 回答