Если кратко: достаю содержимое текстового файла в массив, считаю сколько строк, разбиваю по разделителю \ и заношу в базу, $count=23000, а цикл добавил в базу только 22971 строк; вопрос: я что-то не так сделал или сервер перестал ожидать выполнение цикла? Код (PHP): include_once "база"; header('Content-type: text/html; charset=utf-8'); $answer=file('путь до файла'); $count=count($answer); while($i<=$count) { $i=$i+1; $answ=$answer[$i]; $pieces=explode("\\", $answ); mysql_query("INSERT INTO таблица(колонка1,колонка2) VALUES ('".$pieces[0]."','".$pieces[1]."')"); }
mysql_query - старое расширение, используй PDO или MySQLi. $pieces[0] - нужно экранировать запрос, так как данные из переменной могут поломать синтаксис (http://php.ru/manual/pdo.prepare.html функция mysql_query возвращает результат, подсчитывай кол-во успешного и нет Добавлено спустя 1 минуту 50 секунд: облегчи задачу серверу, делай за один раз 1000 вставок, Код (PHP): ... VALUES ('',''), ('',''), ...
возможно кончилось время php. читай про set_time_limit(). возможно нарушение уникальности значений в таблице. После инсерта можешь сравнивать mysqli_affected_rows() с ожидаемым числом строк.
именно тут не нужно, я сам для себя спарсил базу из файла, не буду же я сам себя взламывать транзакции делать чтоли? нисколько не облегчает ещё лучше, mysql и mysqli в одном файле
DemoN1810, видно ты сам все знаешь. ну так быстро переходи на mysqli иначе ты в команде отстающих. По поводу не добавляющихся значений, в цикле ты сразу делаешь инкремент, поэтому не все данные добавляются. И я прислушался бы к совету denis01 насчет все сразу добавлять в базу. И плюс лучше тут использовать цикл for примерно так: Код (PHP): $answer = file('path'); $count = count($answer); $val = ''; for ($i = 0; $i < $count; $i++) { $pieces = explode("\\", $answer[$i]); if ($i == 0) { $val .= "('$pieces[0]', '$pieces[1]')"; } else { $val .= ",('$pieces[0]', '$pieces[1]')"; } } echo $query = "INSERT INTO tablename(`column0`,`column1`) VALUES $val;";
$i=null=0, $i+1=null+1=0+1=1 в начале цикла, или я что то недопонял? например только что моим способом занёс ещё около 9 тыс записей и всё быстро и без потерь занеслось
Вся эта суета из-за того что вроде у тебя что-то не добавлялось, но тут все добавилось! Ну и отлично! а по поводу цикла. давай разберем порядок как все там происходит. первая твоя ошибка, ты не инициализировал переменную $i и начал к ней обращаться, это должно было вызвать у тебя ошибку Код (PHP): Notice: Undefined variable: i in тут будет ссылка на файл где была ошибка и будет указана строчка кода ты ее не увидел потому что кажись у тебя отключен вывод ошибок. И так. первая итерация Должно быть минимум два notice. Объясняю почему. Два обращения к не инициализированной переменной в логическом выражении цикла и в теле цикла. В то время как в переменной у нас null. смотрим твой код. Ты делаешь так Код (PHP): $i = $i+1; что тут произошло? Вот что: Код (PHP): $i = NULL+1; В итоге значение в $i будет 1 следующая строчка кода Код (PHP): $answ=$answer[$i]; в итоге, мы с ужасом понимаем потеряли часть данных. т.е. $answer[0] осталась за бортом! Это мы рассмотрели первую итерацию цикла. И теперь, важный момент, смотрим логическое выражение цикла и последнюю итерацию цикла: Код (PHP): while($i<=$count) { ты пишешь меньше или равно. В то время как у тебя $i == $count вот эта строчка кода Код (PHP): $answ=$answer[$i]; вызовет у тебя ошибку Код (PHP): Notice: Undefined offset: 1 in тут файл где была ошибка и будет указана строчка А вот почему это произошло, разбирайся сам, и поделись с нами! На будущее, включать вывод ошибок на время отладки приложения. http://php.net/manual/ru/function.error-reporting
разве он не сам по умолчанию ставится? например вывело же предупреждение о mysql, значит есть вывод ошибок
DemoN1810, ты пришел за помошью вроде бы. ни одного плохого совета тебе не дали, но ты как будто отбиваешся от атак не веди себя так, как будто ты всё знаешь. очевидно это не так. включи полный вывод ошибок и добейся чтобы при этом ни одного нотиса и варнинга не возникало. добавляй пачками и сравнивай affected rows с желаемым числом. результат протоколируй. увеличивай time limit. проверь не влияет ли на результат уникальность ключей.
взлом это следствие нарушения синтаксиса, ты можешь сгенерировать не работающий запрос https://dev.mysql.com/doc/refman/5.5/en/insert.html Код (PHP): INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);