Хранимая процедура PHP, PDO ничего не возвращает или не изменяет значение - PullRequest
2 голосов
/ 10 июля 2011

Я использую PHP с MySQL.

Мой сохраненный процесс возвращает значения через параметр out через Toad4MySQL, но когда дело доходит до php Pdo, он не захватывает возвращаемое значение.

вот мой код

$validusername= 'x';
$validemail = 'x'; 
$validkey   = 'x';

$query = $pdo->prepare("Call InsertNewUser(:fullname, :usernamex, :email, :password, :con_password, @:validusername, @:validemail, @:validkey); ");

$query->bindParam(':fullname', $fullname , PDO::PARAM_STR);
$query->bindParam(':usernamex', $usernamex , PDO::PARAM_STR);
$query->bindParam(':email', $email, PDO::PARAM_STR);
$query->bindParam(':password', $password, PDO::PARAM_STR);
$query->bindParam(':con_password', $con_password, PDO::PARAM_STR);
$query->bindParam(':validusername', $validusername, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$query->bindParam(':validemail', $validemail , PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$query->bindParam(':validkey', $validkey   , PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);

$results = $query->  execute();

echo $validemail ; # returns x but not the value that i wanted. 

Может кто-нибудь помочь мне с этой загадкой?

Код моей хранимой процедуры:

DROP PROCEDURE IF EXISTS InsertNewUser;
CREATE PROCEDURE xxx.`InsertNewUser`(

 fullname varchar(255),
 username varchar(255),
 email_address varchar(255), 
 password varchar(255),
 con_password varchar(255),
 out validusername varchar(10),
 out validemail varchar(10),
 out validkey varchar(155)
)
BEGIN

  declare xcnt_1 int;
  declare xcnt_2 int;
    declare xkey varchar(155);
  set xkey = MD5(RAND());

  select count(*) into xcnt_1 from user where user.email_address = email_address;
  select count(*) into xcnt_2 from user where user.username = username;

    if xcnt_1 > 0  then
      set validemail = 'false';
    else 
      set validemail = 'true';
    end if;

     if xcnt_2 > 0  then
      set validusername = 'false';
    else 
      set validusername = 'true';
    end if;

    if xcnt_1 = 0 and xcnt_2 = 0 then

      set validkey = xkey;
      INSERT INTO user
      (user.fullname, user.username, user.email_address, user.password, user.con_password, user.md5validate) 
      VALUES
      (fullname, username, email_address, password, con_password, xkey);
    else
       set validkey = 'false';
    end if;
    commit;

END;

ах ... наконец-то решили эту проблему:

по неизвестным причинам я должен изменить оператор вызова на:

Call InsertNewUser(:fullname, :usernamex, :email, :password, :con_password, @validusername_global, @validemail_global, @validkey_global); 

и используйте эту строку кодов для получения данных ...

$SQL = ' select @validusername_global as validusername, @validemail_global as validemail, @validkey_global as validkey';
$query = $pdo->query($SQL);

while($row = $query->fetch(PDO::FETCH_ASSOC))
{
    print_r($row);
}

Ответы [ 4 ]

1 голос
/ 10 июля 2011

Из руководства по PDO:

int $ length

Длина типа данных.Чтобы указать, что параметр является параметром OUT из хранимой процедуры, вы должны явно установить длину.

http://php.net/manual/en/pdostatement.bindparam.php

Вы пропустили этот параметр, что объясняет, почему онне используется в качестве параметра OUT.

1 голос
/ 10 июля 2011

Выполнение подготовленного оператора PDO не повлияет на $validemail.

После $results = $query->execute(); попробуйте добавить print_r($query->fetchAll());, чтобы получить лучшее представление о том, что возвращается из MySQL в PHP, когда ваш оператор PHP выполняет хранимую процедуру MySQL.

Имейте в виду, что $results будет просто логическим значением, указывающим, может ли быть выполнен оператор.

0 голосов
/ 10 июля 2011

Попробуйте обернуть ваш оператор prepare, связать параметры и выполнить в try, перехватить блоки и посмотреть, не выводит ли PDO какую-либо ошибку.

0 голосов
/ 10 июля 2011

если вы установите $validemail=x и не будете манипулировать / ничего не изменять с помощью $validemail в более позднем коде, то obvioulsy echo $validemail вернет x.?что в этом плохого?либо вы пропустили вставить код

...