PHP - mysql_query returns 0 rows


PHP - mysql_query returns 0 rows

我正在使用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" );
?>

因此,事实证明不存在竞争条件,并且几乎不需要针对此"问题"提出的每个解决方案。

祝你好运