mysqli_query возвращает false с кодом ошибки 0, но запрос завершается успешно
У меня есть огромное количество данных, которые генерируются из сценария PHP и должны быть вставлены в базу данных. Я пробовал разные решения с разными результатами, но текущее решение (и, на мой взгляд, должно быть лучшим) заключается в том, что я генерирую данные в файл CSV, а затем вставляю их в базу данных с помощью следующего запроса:
LOAD DATA LOCAL INFILE 'myfile.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY "'"
Я использую CodeIgniter в качестве фреймворка PHP, и после выполнения запроса я перенаправлен на страницу с ошибкой, которая говорит
Ошибка базы данных Произошла
Номер ошибки: 0
Там нет сообщения об ошибке или что-нибудь.
Я прошел через код, но все, что я могу найти, это то, что mysqli_query()
возвращает ложь и позже mysqli_errno()
возвращает 0 и mysqli_error()
возвращает пустую строку.
Тем не менее, запрос на самом деле успешно выполнен, и когда я смотрю в базу данных, я вижу, что все данные из файла CSV были успешно вставлены. Можно ли ожидать такого поведения? Если так, то мне нужно немного взломать код CodeIgniter или позвонить mysqli_query()
прямо вместо того, чтобы идти через рамки.
Я также выполнил точно такой же запрос в MySQL Workbench, и там не появляется сообщение об ошибке.
3 ответа
У меня была точно такая же проблема, когда я понял, что не подключен к базе данных.
Я звонил require_once('connect.php')
, но это был второй раз в коде, который я использовал require_once
, поэтому PHP не тянет в связи.
Изменение require_once
требовать исправления этой проблемы для меня.
Я никогда не пробовал LOAD INFILE
из php раньше, но быстрый гугл придумал функцию mysqli_set_local_infile_handler (). Возможно, примеры / комментарии могут помочь?
Изменить: Моя теория заключается в том, что запрос ожидает количество строк возвращаемого значения, а соединение не возвращает никаких чисел. Таким образом, пока запрос завершается успешно в конце MySQL, PHP ожидает число> 0, но не получает его. Таким образом, он сообщает об ошибке, без сообщения об ошибке.
Infile_handler вернет количество вставленных строк.
Ошибка (0) в некоторых случаях может просто вводить в заблуждение. Например, при возврате во время обновления mysqli это может просто означать, что изменения были внесены, но по сравнению с последними записями на самом деле ничего не изменилось. Это может быть проблемой, с которой вы столкнулись. Пример с обновлением mysqli показан ниже:
$xCount = 0; //will monitor if changes were done
$updateFlag = false;
$xMsg = '';
$dbx = $this->dbx;
$dbx->select_db("dbname");
$query = "UPDATE xxx_table SET NAME = ?, GENDER = ? WHERE ORG_ID = ? AND EMPID = ?";
$statement = $dbx->prepare($query);
$statement->bind_param('ssss', $flname, $gender, $orgId, $empId);
if($statement->execute()){
$xCount = $statement -> affected_rows; //real-check if changes occured
if($xCount > 0){
$updateFlag = true;
$xMsg = 'Employee Data Successfully Updated';
}else {
//if no changes occur, like same values, this will run
//in this particular case, your may treat as fine
$updateFlag = true;
$xMsg = "Successful With No Major Changes";
}
} else {
//this is simply your coding error;
//die('Error : ('. $dbx->errno .') '. $dbx->error);
$updateFlag = false;
$xMsg = 'Internal Error On Employee Logs';
}
$statement->close();
Я надеюсь, что это поможет решить связанную проблему, может быть, не эту конкретную.