繁体   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