У меня есть хранимая процедура, которая отлично работает в MySQL, возвращая одно значение.PDOStatement :: execute(): Преждевременный конец ошибки данных при выполнении хранимой процедуры
Однако при попытке вызвать его с PHP возвращает правильные значения, но и возвращает ниже трех ошибок
Warning: PDOStatement::execute(): Premature end of data (mysqlnd_wireprotocol
Warning: PDOStatement::execute(): RSET_HEADER packet 1 bytes shorter than expected
Warning: PDOStatement::execute(): Error reading result set's header
Все они относятся к линии 90 где я выполнения SP с помощью ПДО параметризируются запрос
$Statement->execute();
Кто-нибудь знает, почему я получаю эти ошибки? googling around в основном относится к получению этого, когда ему отказывают в доступе к БД со старым паролем стиля. У меня нет этой проблемы, так как SP работает, возвращая правильные значения, но с тремя сообщениями об ошибках.
Привет, Маркус, Спасибо, что ответили. Извините, меня не было. Моя версия PHP - 5.5.12, а версия MySQL - 5.6.17. Я использую последнюю версию WampServer на моем ящике. В сообщениях об ошибках не упоминается «использование старого пароля». В настоящее время я получаю, что SP работает нормально, используя приведенный ниже код, но я должен вернуть результат SP как VARCHAR, а затем преобразовать строку «true/false» в bool с PHP. Если я пытаюсь возвращения значения SP как INT это, когда я получаю ошибки ...
хранимая процедура:
CREATE DEFINER=`MyDB`@`localhost` PROCEDURE `new_account`(
IN Cus_Title VARCHAR(4),
IN Cus_Name VARCHAR(35),
IN Cus_Surname VARCHAR(35),
IN Cus_Email VARCHAR(75),
IN Cus_Password VARBINARY(255),
IN Cus_Status TINYINT(1),
IN Cus_LoginIP VARCHAR(45),
IN Cus_Created TIMESTAMP,
IN Pho_Number VARCHAR(14),
IN Com_Name VARCHAR(50),
IN Com_BuildingNumber VARCHAR(14),
IN Com_Address VARCHAR(100),
IN Com_Street VARCHAR(35),
IN Com_City VARCHAR(25),
IN Com_County VARCHAR(35),
IN Com_PostCode VARCHAR(12),
IN Act_ActivationToken VARBINARY(255),
IN Act_Expiry TIMESTAMP,
-- OUT ReturnStatus INT(3) using this I get errors from PHP
OUT ReturnStatus VARCHAR(5)
)
BEGIN
DECLARE Cus_ID INT(11) UNSIGNED; -- CustomerID
DECLARE Com_ID INT(11) UNSIGNED; -- CompanyID
IF EXISTS(SELECT Email FROM customers WHERE Email = Cus_Email) THEN
SET ReturnStatus = "false";
SELECT ReturnStatus;
ELSE
INSERT INTO customers(Title, Name, Surname, Email, Password, Status, LoginIP, Created)
VALUES(Cus_Title, Cus_Name, Cus_Surname, Cus_Email, Cus_Password, Cus_Status, Cus_LoginIP, Cus_Created);
SET Cus_ID = LAST_INSERT_ID();
IF(Pho_Number != '') THEN -- Customer has registered a mobile number
INSERT INTO customers_phones(CustomerID, Type, Number)
VALUES(Cus_ID, 'Mobile', Pho_Number);
END IF;
IF EXISTS(SELECT ID, Name, PostCode FROM companys WHERE Name = Com_Name AND PostCode = Com_PostCode) THEN
SET Com_ID = (SELECT ID FROM companys WHERE Name = Com_Name AND PostCode = Com_PostCode);
ELSE
INSERT INTO companys(Name, BuildingNumber, Address, Street, City, County, PostCode)
VALUES(Com_Name, Com_BuildingNumber, Com_Address, Com_Street, Com_City, Com_County, Com_PostCode);
SET Com_ID = LAST_INSERT_ID();
END IF;
INSERT INTO customers_order_delivery(CustomerID, CompanyID)
VALUES(Cus_ID, Com_ID);
INSERT INTO customers_activations(CustomerID, ActivationToken, Expiry)
VALUES(Cus_ID, Act_ActivationToken, Act_Expiry);
INSERT INTO customers_subscriptions(CustomerID, Type, Method)
VALUES(Cus_ID, 'Newsletter', 'Email');
SET ReturnStatus = 'true';
SELECT ReturnStatus;
END IF;
END;
PHP bindings are as follows and are contained within a try/catch block:
$SQL = 'call new_account(:Cus_Title, :Cus_Name, :Cus_Surname, :Cus_Email, :Cus_Password, :Cus_Status, :Cus_LoginIP, :Cus_Created, :Pho_Mobile, :Com_Name, :Com_BuildingNumber, :Com_Address, :Com_Street, :Com_County, :Com_City, :Com_PostCode, :Act_ActivationToken, :Act_Expiry, :ReturnStatus)';
$Statement = $Connection->prepare($SQL);
#Bind parameters
$Statement->bindParam(':Cus_Title', $_Form->Validated['Title']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Cus_Name', $_Form->Validated['Name']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Cus_Surname', $_Form->Validated['Surname']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Cus_Email', $_Form->Validated['Email']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Cus_Password', $_Form->Validated['Password']['input'], PDO::PARAM_LOB);
$Statement->bindParam(':Cus_Status', $_Form->Validated['UserStatus']['input'], PDO::PARAM_INT);
$Statement->bindParam(':Cus_LoginIP', $_Form->Validated['LoginIP']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Cus_Created', $_Form->Validated['CreatedOn']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Pho_Mobile', $_Form->Validated['Mobile']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Act_ActivationToken', $_Form->Validated['ActivationToken']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Act_Expiry', $_Form->Validated['Expiry']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_Name', $_Form->Validated['Company']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_BuildingNumber', $_Form->Validated['BuildingNumber']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_Address', $_Form->Validated['Address']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_Street', $_Form->Validated['Street']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_City', $_Form->Validated['City']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_County', $_Form->Validated['County']['input'], PDO::PARAM_STR);
$Statement->bindParam(':Com_PostCode', $_Form->Validated['PostCode']['input'], PDO::PARAM_STR);
$Statement->bindParam(':ReturnStatus', $ReturnStatus, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 3);
$Statement->execute();
$AccountCreationStatus = $Statement->fetchColumn(); //Check the account was successfully created
$AccountCreationStatus = ($AccountCreationStatus == 'true') ? true : false; // Convert return from SP as currently its buggy as cannot return INT or BOOL
if($AccountCreationStatus){ // New account was successfully created
#Send new user activation email
Привет R3uK, EdChum, Wtower, Раджеш и pinkal Мой пост не дубликат, потому что в решении, указанном В этом случае они говорят о невозможности подключения к MySQL. Если вы все прочитали мой пост немного внимательнее, вы увидите, что я могу подключиться к MySQL отлично, о чем свидетельствует мой SP и скрипт, способный работать. Возврат правильных значений в виде строки. однако, если я попытаюсь получить return как int из 1 или 0, я все равно получаю правильный вывод возврата из SP, но с добавлением 3 сообщений об ошибке php, следующих сразу после выхода, и они ничего не упоминают о «старой аутентификации». To во избежание путаницы и для ясности сообщения об ошибках в полном объеме являются: (!)
-
- Предупреждение: Неизвестный: Преждевременный конец данных (mysqlnd_wireprotocol.c: 1116) в Unknown в строке 0
-
- (!) Предупреждение: Неизвестно: RS ET_HEADER пакет 1 байт короче, чем ожидалось в Unknown в строке 0
-
- (!) Предупреждение: Неизвестный: заголовок Error Результат считывания, в Unknown в строке 0
Кроме того, прежде чем я отправил я потратил значительное количество времени на поиск возможных решений и видел этот пост и проверил мои пароли MySQL, и он использует новую аутентификацию ... если я не пропущу что-то. Пожалуйста, будьте немного более осторожны в следующий раз, прежде чем отклонять сообщение как дубликат, поскольку из моего сообщения ясно, что это не так.
Это сказало, что любая помощь будет очень признательна.PHP Addict
Просьба отправить ссылку на параметр, хранимую процедуру и версию MySQL и PHP, а также –
Я дал ответ, надеюсь, вам это поможет. –