PHP: MySQLi-запрос возвращает false с нулевой ошибкой при запуске cronjob через CLI, но работает, если скрипт вызова через веб-сервер - PullRequest
0 голосов
/ 01 ноября 2018

Этот сценарий работал отлично в течение многих лет и все еще работает нормально при определенных обстоятельствах, но я пытаюсь проверить другое обстоятельство, но он терпит неудачу без каких-либо сообщений об ошибках.

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

Я использую следующее с 3-мя почтовыми ящиками электронной почты - я проверяю электронную почту, использую детали в теме, чтобы подтвердить клиента, а затем устанавливаю объект клиента перед вставкой содержимого электронной почты против клиента.

Это было и до сих пор работает нормально для существующих 2 почтовых ящиков, однако 3-й (новый почтовый ящик) просто перестает работать на $this->mysqli->query($query), возвращая false.

Он извлекает письмо правильно, как я вижу, выводя тему письма - у него есть, он прочитал его, правильно построил SQL-запрос ... Он просто не будет успешно выполнен ...

        //Build the query
    $query = "SELECT id, 
                     parent_id, 
                     name, 
                     storeno,
                     make,
                     active_advisors,
                     address,
                     primary_contact,
                     primary_phone,
                     primary_email,
                     secondary_contact,
                     secondary_phone,
                     secondary_email,
                     daily_email_receipients,
                     wty_analysis_email_recipients,
                     created,
                     expiry,
                     modified,
                     modified_by,
                     active,
                     customer_type
              FROM Customer
              WHERE LOWER(name) = LOWER('".addslashes($emailHeader['customername'])."')
                AND LOWER(storeno) = LOWER('".$emailHeader['storeno']."')
                AND LOWER(make) = LOWER('".$emailHeader['make']."')";

        //debug query
        print $query;

        //Execute the query and validate that it was executed without issue
        if( $result = $this->mysqli->query($query) ) {

            //Print row count for debugging
            print "Select returned ".mysqli_num_rows($result)." matching rows for 'Customer' lookup.";

            //Check to see if we got what we expected (an single exact match!)
            if (mysqli_num_rows($result)==1) {

                //Transfer the result into a usable Object
                while ($row = $result->fetch_object()) {

                    $this->setCustomerInformation($row);
                }
            }

            // If we get 0 then we have no match
            // If we get > 1 then we have a problem (and still no match)
            else { 

                print "Could not match email details to a customer: (".implode(",",$emailHeader).")"; 
                return false;
            }

        }
        else { 
            print 'Mysqli Query returned false: " ('.serialize($this->mysqli).')';
            print mysqli_errno($this->mysqli);
            print mysqli_error($this->mysqli);
            return false;
        }   

Выходы:

SELECT id, 
                     parent_id, 
                     name, 
                     storeno,
                     make,
                     active_advisors,
                     address,
                     primary_contact,
                     primary_phone,
                     primary_email,
                     secondary_contact,
                     secondary_phone,
                     secondary_email,
                     daily_email_receipients,
                     wty_analysis_email_recipients,
                     created,
                     expiry,
                     modified,
                     modified_by,
                     active,
                     customer_type
              FROM Customer
              WHERE LOWER(name) = LOWER('XXXXXXXX')
                AND LOWER(storeno) = LOWER('S01')
                AND LOWER(make) = LOWER('FO')

Mysqli Query returned false: " (O:6:"mysqli":19:{s:13:"affected_rows";N;s:11:"client_info";N;s:14:"client_version";N;s:13:"connect_errno";N;s:13:"connect_error";N;s:5:"errno";N;s:5:"error";N;s:10:"error_list";N;s:11:"field_count";N;s:9:"host_info";N;s:4:"info";N;s:9:"insert_id";N;s:11:"server_info";N;s:14:"server_version";N;s:4:"stat";N;s:8:"sqlstate";N;s:16:"protocol_version";N;s:9:"thread_id";N;s:13:"warning_count";N;})

Что я сделал до сих пор:

  1. Я вывел $ query и запустил его в MySQL, и он успешно вернул правильный результат
  2. Я сравнил объект mysqli на всех 3 проверках почтовых ящиков, и они идентичны
  3. Я запустил процесс с письмом в каждом почтовом ящике (первый 2 = успех) и третий сбой
  4. Я запустил процесс, только в 3-м почтовом ящике была только почта = ошибка (возможно, я сбрасывал соединение)

У меня закончились идеи - проверить и не знаю, куда идти

Вывод ошибки равен NULL

Дополнительный тест - этот процесс выполняется через задание cron - я только что запустил процесс вручную через браузер, и он работает ...

  • Версия PHP в браузере и клиенте совпадают
  • Объекты Mysqli идентичны в браузере и CLI
  • mysqli-> Query () результат отличается:

CLI:

NULL

Браузер:

mysqli_result Object
(
    [current_field] => 
    [field_count] => 
    [lengths] => 
    [num_rows] => 
    [type] => 
)

Только что открыл, mysqli-> stat ()

CLI: NULL Браузер: Населенный

Очевидно, что существует проблема с объектом MySQLi

1 Ответ

0 голосов
/ 01 ноября 2018

Попробуйте позвонить mysqli_report(MYSQLI_REPORT_ALL) перед запросом данных. Включает или отключает функции внутреннего отчета.

mysqli_report на php.net .

Также предлагаю не смешивать объектно-ориентированный и процедурный стиль PHP: библиотека MySQLi .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...