<?php
// Make a MySQL Connection
$mysqli = new mysqli("server", "user","pass","database") or die(mysqli_error());
$result = $mysqli -> query("SELECT * FROM testimage WHERE OCTET_LENGTH( IMAGE ) >200000 ") or die(mysqli_error());
if($result){
// Cycle through results
while ($row = $result->fetch_assoc()) {
file_put_contents($row['ID'].'.png', $row['IMAGE']);
}
// Free result set
$result->close();
}
?>
我将图像作为longblob对象直接存储在我的测试数据库中,我试图抓取所有大于200k的图像。当我以这种方式查询时,我收到两个错误。这些发布在下面。
如果我在没有检查长度的情况下查询,我会得到相同的错误。
这个php在我的笔记本电脑上在mac os x上运行,如果这很重要的话。当数据库包含较少数量的图像时,相同的代码工作正常。对这个错误的其他解释提到了大的结果集,但他们也提到改变表格,我不相信我在做。
数据库包含1000张图像中的大约440兆。存储为LONGBLOB对象
警告:第5行的Get_All_Images_DB_BLUEHOST2.php中的空行数据包正文
警告:mysqli :: query():( 00000/0):第5行的Get_All_Images_DB_BLUEHOST2.php
另一条信息,错误总是发生在大约109 - 120秒。
答案 0 :(得分:3)
<?php
// Make a MySQL Connection
$mysqli = new mysqli("host", "user", "pass","database") or die(mysqli_error());
$result = $mysqli -> query("SELECT MAX(ID) FROM testimages ") or die(mysqli_error());
$data = mysqli_fetch_array($result);
$result->close();
$mysqli->close();
$maxid = $data[0];
$off = 0;
$dur = 50;
for ($i = 1; $i <= ($maxid/50)+1; $i++){
$mysqli = new mysqli("host", "user", "pass","db") or die(mysqli_error());
$result = $mysqli -> query("SELECT * FROM testimage LIMIT $off,$dur ") or die(mysqli_error());
if($result){
// Cycle through results
while ($row = $result->fetch_assoc()) {
//echo($row['TAG']);
//echo(":");
//$row['IMAGE']
echo ", ";
echo ($row['ID']);
file_put_contents($row['ID'].'.png', $row['IMAGE']);
}
// Free result set
$result->close();
$mysqli->close();
}
$off += 50;
}
?>
这是我通过限制结果集来避免上述错误的天真解决方案,通过获取最大结果数并使用LIMIT递增该数字。