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