[英]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.