PHP stmt готов к работе, но ошибок нет

Я пытаюсь подготовить mysqli-запрос, но он терпит неудачу без каких-либо ошибок.

$db_hostname = "test.com"; $db_database = "dbname"; $db_username = "db_user"; $db_password = "password"; $db = new mysqli($db_hostname,$db_username,$db_password,$db_database); $q = "INSERT INTO Members (`wp_users_ID`,`MemberID`,`Status`,`MiddleName`,`Nickname`,`Prefix`,`Suffix`,`HomeAddress`,`City`,`State`,`Zip`,`ExtendedZip`,`BadAddress`,`SpouseFirstName`,`SpouseMiddleName`,`HomePhone`,`CellPhone`,`WorkPhone`,`WorkPhoneExt`,`OfficePhone`,`OfficePhoneExt`,`Pager`,`Fax`,`Company`,`CompanyType`,`OfficeAddress`,`OfficeAddress2`,`OfficeCity`,`OfficeState`,`OfficeZip`,`OTYPECO`,`OSTAG`,`UPCODE`,`Region`,`Department`,`Classification`,`Retired`,`Industry`,`Comments`,`Officer`,`OfficerType`,`OfficerTitle`,`OUNIT`,`ReceiveEMagazine`,`CD`,`SD`,`AD`,`isOrganization`,`DEL`,`Dues`,`DataSource`) VALUES ((?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?));"; $stmt = $db->prepare($q); if ( false === $stmt ) { echo "<pre>"; print_r( $db ); echo "</pre>"; mysqli_report(MYSQLI_REPORT_ALL); echo mysqli_error(); } 

Единственная часть, которая на самом деле показывает что-либо, – print_r ($ db):

  mysqli Object ( [affected_rows] => -1 [client_info] => 5.1.73 [client_version] => 50173 [connect_errno] => 0 [connect_error] => [errno] => 0 [error] => [error_list] => Array ( ) [field_count] => 1 [host_info] => dbhost.com via TCP/IP [info] => [insert_id] => 919910 [server_info] => 5.1.73-log [server_version] => 50173 [stat] => Uptime: 1924325 Threads: 8 Questions: 642600129 Slow queries: 28158 Opens: 24168750 Flush tables: 1 Open tables: 403 Queries per second avg: 333.935 [sqlstate] => 00000 [protocol_version] => 10 [thread_id] => 9939810 [warning_count] => 0 ) 

Кто-нибудь видит что-нибудь, что может вызвать это? Без каких-либо ошибок трудно понять, что не так … Я попытался скопировать и вставить полученный результат непосредственно в phpmyadmin, и он прошел отлично (после того, как вручную заменили вопросительные знаки на тестовые значения).

Благодаря!

ОБНОВИТЬ

Похоже, что после добавления mysqli_report (MYSQLI_REPORT_ALL); в верхней части страницы, запрос ВЫШЕ, запрос на вставку не выполняется, хотя по-прежнему не указана ошибка. Это не выполняется при выполнении:

  echo "1"; $idDataSources = ""; echo "2"; $q = "SELECT idDataSources FROM DataSources WHERE `description`=(?);"; echo "3"; $stmt = $db->prepare($q); echo "4"; $stmt->bind_param('s',$description); echo "5"; $description = "File - 01/10/2015"; echo "6"; $stmt->execute() or die( mysqli_stmt_error( $stmt ) ); echo "7"; $stmt->bind_result($idDataSources); echo "8"; $stmt->fetch(); echo "9"; unset($params); 

ВЫВОД:

  123456 

Он получает $ stmt-> execute () и терпит неудачу. Еще раз, я попытался вывести ошибку, но ничего не появляется. Это действительно озадачивает. Мне интересно, следует ли мне вернуться к старому методу mysql (не объектно-ориентированный) … он был небезопасным, но, по крайней мере, он работал последовательно и показывал ошибки, когда что-то не так.

ОБНОВЛЕНИЕ 2

Ну, я просто переписал весь скрипт, используя mysql (не объектно-ориентированный), а не mysqli … работает как сон. Мне хотелось бы перейти на более новые стандарты, но со случайными сбоями и плохой отчетностью об ошибках, как это, это очень сложно. Я поставил «лучшую» версию, пока не смогу понять, почему она терпит неудачу.

ОБНОВЛЕНИЕ 3

Я заметил интересное поведение с mysqli. В другом месте того же кода у меня два запроса, проходящих через STMT один за другим. Время от времени это терпело неудачу. Ошибки были непротиворечивыми, так как я мог отправлять идентичные данные в 50 раз и из них, он мог бы сбить 20 раз … те же данные, одну и ту же функцию.

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

 $q = ""; $stmt = $this->db->prepare( "SELECT ID FROM Members WHERE MemberID='5' LIMIT 1;" ); $stmt->execute(); $stmt->store_result(); if ( $stmt->num_rows > 0 ) { $q = "UPDATE Members SET Name='Test' WHERE MemberID=(?) LIMIT 1;"; } $stmt->close(); // here if we continue, it has a chance of erroring out. However, // if we run just the following command instead, everything works perfect. // // mysql_query( "UPDATE Members SET Name='Test' WHERE MemberID='5' LIMIT 1;" ); if ( $q != "" ) { $stmt = $this->db->prepare($q); $stmt->bind_param('i',$params['ID']); $params['ID'] = 5; $stmt->execute(); $stmt->close(); unset($params); } эта $q = ""; $stmt = $this->db->prepare( "SELECT ID FROM Members WHERE MemberID='5' LIMIT 1;" ); $stmt->execute(); $stmt->store_result(); if ( $stmt->num_rows > 0 ) { $q = "UPDATE Members SET Name='Test' WHERE MemberID=(?) LIMIT 1;"; } $stmt->close(); // here if we continue, it has a chance of erroring out. However, // if we run just the following command instead, everything works perfect. // // mysql_query( "UPDATE Members SET Name='Test' WHERE MemberID='5' LIMIT 1;" ); if ( $q != "" ) { $stmt = $this->db->prepare($q); $stmt->bind_param('i',$params['ID']); $params['ID'] = 5; $stmt->execute(); $stmt->close(); unset($params); } не $q = ""; $stmt = $this->db->prepare( "SELECT ID FROM Members WHERE MemberID='5' LIMIT 1;" ); $stmt->execute(); $stmt->store_result(); if ( $stmt->num_rows > 0 ) { $q = "UPDATE Members SET Name='Test' WHERE MemberID=(?) LIMIT 1;"; } $stmt->close(); // here if we continue, it has a chance of erroring out. However, // if we run just the following command instead, everything works perfect. // // mysql_query( "UPDATE Members SET Name='Test' WHERE MemberID='5' LIMIT 1;" ); if ( $q != "" ) { $stmt = $this->db->prepare($q); $stmt->bind_param('i',$params['ID']); $params['ID'] = 5; $stmt->execute(); $stmt->close(); unset($params); } 

Может ли кто-нибудь объяснить это поведение? Кажется, что они никогда не конфликтуют, так как я использую команду close (), прежде чем запускать новый запрос, и это НЕКОТОРЫЕ РАБОТЫ времени … кажется странным.

Вот немного адаптированный пример скрипта php.net с обработкой ошибок:

 <?php $mysqli = new mysqli("example.com", "user", "password", "database"); if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; } /* Prepared statement, stage 1: prepare */ if (!($stmt = $mysqli->prepare("SELECT idDataSources FROM DataSources WHERE `description`=(?)"))) { echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; } /* Prepared statement, stage 2: bind and execute */ $description = "File - 01/10/2015"; if (!$stmt->bind_param('s', $description)) { echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; } if (!$stmt->execute()) { echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; } /* explicit close recommended */ $stmt->close(); ?> 

Обратите внимание, что либо $ mysqli, либо $ stmt могут содержать описание ошибки.

mysqli_error () не является функцией, если вы не определили ее.

попробуйте это, он должен сообщить вам источник ошибки.

 echo $db::$error; 

В вашем начальном посте;

 $q = "INSERT INTO Members (`wp_users_ID`,`MemberID`,`Status`,`MiddleName`,`Nickname`,`Prefix`,`Suffix`,`HomeAddress`,`City`,`State`,`Zip`,`ExtendedZip`,`BadAddress`,`SpouseFirstName`,`SpouseMiddleName`,`HomePhone`,`CellPhone`,`WorkPhone`,`WorkPhoneExt`,`OfficePhone`,`OfficePhoneExt`,`Pager`,`Fax`,`Company`,`CompanyType`,`OfficeAddress`,`OfficeAddress2`,`OfficeCity`,`OfficeState`,`OfficeZip`,`OTYPECO`,`OSTAG`,`UPCODE`,`Region`,`Department`,`Classification`,`Retired`,`Industry`,`Comments`,`Officer`,`OfficerType`,`OfficerTitle`,`OUNIT`,`ReceiveEMagazine`,`CD`,`SD`,`AD`,`isOrganization`,`DEL`,`Dues`,`DataSource`) VALUES ((?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?));"; 

Я бы изменил это;

 $q = "INSERT INTO Members (`wp_users_ID`,`MemberID`,`Status`,`MiddleName`,`Nickname`,`Prefix`,`Suffix`,`HomeAddress`,`City`,`State`,`Zip`,`ExtendedZip`,`BadAddress`,`SpouseFirstName`,`SpouseMiddleName`,`HomePhone`,`CellPhone`,`WorkPhone`,`WorkPhoneExt`,`OfficePhone`,`OfficePhoneExt`,`Pager`,`Fax`,`Company`,`CompanyType`,`OfficeAddress`,`OfficeAddress2`,`OfficeCity`,`OfficeState`,`OfficeZip`,`OTYPECO`,`OSTAG`,`UPCODE`,`Region`,`Department`,`Classification`,`Retired`,`Industry`,`Comments`,`Officer`,`OfficerType`,`OfficerTitle`,`OUNIT`,`ReceiveEMagazine`,`CD`,`SD`,`AD`,`isOrganization`,`DEL`,`Dues`,`DataSource`) VALUES (?, ?, ..., ?, ?)"; 

Я удалил одну точку с запятой, которую вы имели в двойных кавычках вашего запроса MySQL. Также я удалил круглые скобки вокруг вопросительных знаков. И, конечно, эллипсис (…) внутри значений – это просто так, что мне не нужно набирать все ваши вопросительные знаки (вы должны поместить их обратно в свой код).