簡體   English   中英

為什么PHP中的mySQL返回空結果?

[英]Why is mySQL in PHP returning null results?

我試圖將〜55K記錄從mySQL服務器遷移到MongoDB。 我無法通過任何易於訪問的方法(例如JSON / CSV導入)來執行此操作,因為數據存儲方法(結構化方式)將大不相同。 因此,我在php中創建了一個腳本來完成此任務。

我一直遇到的問題是,在大型數據集上(即使較小的數據集包含問題條目,使用較小的數據集也無法重現),盡管條目存在,但查詢有時仍不會報告任何數據。 它絕對存在,因為當php直接訪問該特定條目或它包含在較小的數據集中時,它就可以正常工作。 例如,在導入文本文件時,我只收到了約42k / 54k記錄。

在我通過URL接收到的回聲中,調用了php文件,這表明查詢被調用了正確的次數,但是有許多記錄顯示為不存在,因此應答的回聲為空。 該代碼包括在下面:

//Makes a connection to the database
$conn = makeConnection();

$filename = '/home/dbserverdownload.txt';
$file = fopen($filename, 'a');

$sql = "SELECT * FROM maintable ORDER BY ID DESC LIMIT 1";
$resultID = mysqli_query($conn, $sql);
$ID = mysqli_fetch_object($resultID);
echo $ID->ID;
//loops through the database and appends the data to the file as it goes
for($var=2; $var <= $ID->ID; $var++){
    $sql1 = "SELECT * FROM servertable WHERE ID = '$var'";
    $result1 = mysqli_query($conn, $sql1);
    $values = mysqli_fetch_object($result1);

    $id =  $values->ID;
    $ip = $values->IP;
    $port = $values->port;
    $running = $values->running;
    $afk = $values->afk;
    $gamemode = $values->gamemode;
    $maxplayers = $values->maxplayers;
    $spawnprotection = $values->spawnprotection;
    $whitelist = $values->whitelist;
    $enablequery = $values->enablequery;
    $enablercon = $values->enablercon;
    $rconpassword = $values->rconpassword;
    $motd = $values->motd;
    $achievements = $values->announceplayerachievements;
    $allowflight = $values->allowflight;
    $spawnanimals = $values->spawnanimals;
    $spawnmobs = $values->spawnmobs;
    $forcegamemode = $values->forcegamemode;
    $hardcore = $values->hardcore;
    $pvp = $values->pvp;
    $difficulty = $values->difficulty;
    $generatorsettings = $values->generatorsettings;
    $levelname = $values->levelname;
    $levelseed = $values->levelseed;
    $leveltype = $values->leveltype;
    $autosave = $values->autosave;

if($ip == "148.57.44.10"){
  //if the server is server1
  $servername = "server1".$port;
} else if ($ip == "165.108.22.199"){
  //if the server is server2
  $servername = "server2".$port;
} else{
  $servername = "";
}



//Adds all content that was already gained to the JSON string
$startingContent = "{\"_id\":\"$servername\",
                    \"ip\":\"$ip\",
                    \"port\":\"$port\",
                    \"running\":\"$running\",
                    \"afk\":\"$afk\",
                    \"gamemode\":\"$gamemode\",
                    \"maxplayers\":\"$maxplayers\",
                    \"spawnprotection\":\"$spawnprotection\",
                    \"whitelist\":\"$whitelist\",
                    \"enablequery\":\"$enablequery\",
                    \"enablercon\":\"$enablercon\",
                    \"rconpassword\":\"$rconpassword\",
                    \"motd\":\"$motd\",
                    \"announceplayerachievements\":\"$achievements\",
                    \"allowflight\":\"$allowflight\",
                    \"spawnanimals\":\"$spawnanimals\",
                    \"spawnmobs\":\"$spawnmobs\",
                    \"forcegamemode\":\"$forcegamemode\",
                    \"hardcore\":\"$hardcore\",
                    \"pvp\":\"$pvp\",
                    \"difficulty\":\"$difficulty\",
                    \"generatorsettings\":\"$generatorsettings\",
                    \"levelname\":\"$levelname\",
                    \"levelseed\":\"$levelseed\",
                    \"leveltype\":\"$leveltype\",
                    \"autosave\":\"$autosave\"
                  }";



echo $startingContent."<br/>";


//This is the JSON data that will be passed to mongo

if(strlen($ip)>6){
    if (fwrite($file, $startingContent) === FALSE) {
        echo "Cannot write to file ($filename) with $startingContent";
        exit;
    }
}
}

我也用一個查詢來嘗試此操作,該查詢將一大批結果(全部,一半,四分之一等)拉成一個塊,而不是大量的單個查詢。 該實驗的最終結果是每次運行時都會更新可變數量的記錄(通常是400到4000之間的隨機數)。 有誰知道為什么會這樣? 如果不是,我是否應該編寫自己的程序來迭代可從mySQL導出的CSV?

首先,替換查詢$sql = "SELECT * FROM maintable ORDER BY ID DESC LIMIT 1"; $sql = "SELECT MAX(ID) as ID FROM maintable"; 以獲得更好的性能。

這里的問題是您可能有一個返回false的查詢,然后您的應用程序死亡。 舉例來說,假設您的循環嘗試查詢ID=3 ,但是數據庫中沒有使用該ID的行。 然后,下幾行將引發您沒有看到的異常。 您可以在開發機php.ini使用set display_errors=On

使用它來檢查是否有要獲取的結果:

....
for($var=2; $var <= $ID->ID; $var++){
    $sql1 = "SELECT * FROM servertable WHERE ID = '$var'";
    $result1 = mysqli_query($conn, $sql1);

    if($result) {
        $values = mysqli_fetch_object($result1);

        $id =  $values->ID;
        $ip = $values->IP;
        ....

暫無
暫無

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

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