2015-11-21 8 views
1

У меня есть хранимая процедура, которая отлично работает в 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

+0

Просьба отправить ссылку на параметр, хранимую процедуру и версию MySQL и PHP, а также –

+0

Я дал ответ, надеюсь, вам это поможет. –

ответ

0

Я думаю, вы просто пропустили какую-то информацию в вашем посте, так что полное сообщение об ошибке звучит как этот:

...: Premature end of data (mysqlnd_wireprotocol.c:554) in ... 
...: OK packet 1 bytes shorter than expected in ... 
...: mysqlnd cannot connect to MySQL XXX using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP XXX or earlier you might need to remove the old-passwords flag from your my.cnf file in ... 

Если так что вы можете легко решить вашу проблему, следуя информации в тексте ошибки. Вы можете найти более подробную информацию here.

+1

Привет, Маркус, ни одна ошибка не говорит об этом. Я исследовал, что ранее перед публикацией ... –

Смежные вопросы