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();

Я надеюсь, что это поможет решить связанную проблему, может быть, не эту конкретную.

Другие вопросы по тегам