我正在将数据txt文件插入我的MySQL数据库。并且有100-400个单词的文件插入很棒。没问题。但今天我得到了一个9k字的文件,我的脚本停止了工作。它什么都不插入或更新。我的脚本有问题,还是应该制作此文件的一部分?什么是更好的解决方案?
这是我的代码:
//$arr - array from file;
foreach ($arr as $temp)
{
$w_name = mysqli_real_escape_string($db_connect, $temp[0]);
$w_minprice = $temp[2];
$w_js_id = $temp[1];
$w_s = $temp[3];
$sql ="SELECT `js_id` FROM `mytable` WHERE `js_id` = '$w_js_id' LIMIT 1";
$result = mysqli_query($db_connect, $sql) or die(mysql_error());
list($temp2) = mysqli_fetch_row($result);
if ($temp2 == '')
{
$sql = "INSERT INTO `mytable` (`name`, `minprice`, `s`, `js_id`, `pl`) VALUES ('$w_name', '$w_minprice', '$w_s', '$w_js_id', '$pl')";
$result = mysqli_query($db_connect, $sql) or die(mysql_error());
if ($result) {$added++;}
}
else
{
$sql = "UPDATE `mytable` SET `minprice` = '$w_minprice', `s` = '$g_s' WHERE `js_id` = '$w_js_id' LIMIT 1";
$result = mysqli_query($db_connect, $sql) or die(mysql_error());
if ($result) {$updated++;}
}
}
也许我应该做多个查询?或者将我的查询分成10个?但是怎么样?我在MySQL查询中并不强大。 我的目标是向我的数据库插入一个包含9 000个值的数组。
更新:我添加了这一行: ini_set(' memory_limit',' -1'); ini_set(' max_execution_time',' -1'); 在我的mysql中添加: max_allowed_packet = 32M;
它用脚本解决了我的问题!
答案 0 :(得分:2)
可能的内存或执行时间限制问题。 尝试在php文件上添加以下2行
ini_set('memory_limit', '-1');
ini_set('max_execution_time', '-1');
答案 1 :(得分:1)
以上关于 memory_limit 和 max_execution_time 的帖子应该可以解决您的问题。要捕获任何php问题,您可以添加
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('memory_limit', '256M');
ini_set('max_execution_time', '240');
我只是想建议一种更优化的导入方式,以节省查询并可能更快地运行
$sthi=mysqli_prepare($db_connect,"INSERT INTO `mytable` (`name`, `minprice`, `s`, `js_id`, `pl`) VALUES (?, ?, ?, ?, ?)") or die(mysqli_error($db_connect));
$sthi->bind_param("sssss", $w_name, $w_minprice,$w_s,$w_js_id,$pl);
$sthu=mysqli_prepare($db_connect,"UPDATE `mytable` SET `minprice` = ?, `s` = ? WHERE `js_id` = ? LIMIT 1") or die(mysqli_error($db_connect));
$sthu->bind_param("sss", $w_minprice,$w_s,$w_js_id);
$i=0;
foreach ($arr as $temp) {
$w_name = $temp[0];
$w_minprice = $temp[2];
$w_js_id = $temp[1];
$w_s = $temp[3];
@$sthi->execute();
//If insert was unsuccessfull the record already exists
if($sthi->affected_rows==1){
$added++;
}
//Otherwise you need to update it - run the update startement
else {
if($sthu->execute()){
if($sthu->affected_rows==1){
$updated++;
}
}
else echo $sthu->error."<br>";
}
flush();
set_time_limit(30);
//Not really necessary - just for debugging
echo ++$i." u:".$updated." a:".$added."<br>";
}