簡體   English   中英

PHP - mysql_query返回0行

[英]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';
}

在使用mysql_query執行它之前,嘗試先打印這些變量$date1$date2 如果某些格式與數據庫不匹配,請查看打印內容然后更改它。 也許這可能是唯一的原因。 除了這個建議:你可以做很多事情來調試你的問題。 打印實際查詢您正在執行的內容。 復制它並在phpmyadmin.compare執行它的差異。

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

?>

因此,事實證明不存在競爭條件,並且幾乎不需要用於解決這個“問題”的每個解決方案。

祝好運,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM