Я пытаюсь подготовить запрос MySQL, но он молча завершается без каких-либо ошибок.
$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
Я заметил интересное поведение с MySQL. В другом месте в одном и том же коде у меня два запроса, выполняющихся через 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);
}
Кто-нибудь может объяснить это поведение? Не похоже, чтобы они когда-либо конфликтовали, так как я использую команду 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. Также я убрал круглые скобки вокруг вопросительных знаков. И, конечно, многоточие (…) внутри значений просто для того, чтобы мне не нужно было печатать все ваши вопросительные знаки (вы должны поместить их обратно в свой код).