Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP、PDO存储过程不返回任何内容或未更改的值_Php_Mysql_Stored Procedures_Pdo_Out Parameters - Fatal编程技术网

PHP、PDO存储过程不返回任何内容或未更改的值

PHP、PDO存储过程不返回任何内容或未更改的值,php,mysql,stored-procedures,pdo,out-parameters,Php,Mysql,Stored Procedures,Pdo,Out Parameters,我正在使用php和mysql 我存储的proc通过Toad4MySQL通过out参数返回值,但当涉及到phppdo时,它不会捕获返回值 这是我的密码 $validusername= 'x'; $validemail = 'x'; $validkey = 'x'; $query = $pdo->prepare("Call InsertNewUser(:fullname, :usernamex, :email, :password, :con_password, @:validuser

我正在使用php和mysql

我存储的proc通过Toad4MySQL通过out参数返回值,但当涉及到phppdo时,它不会捕获返回值

这是我的密码

$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语句更改为:

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);
}

如果您设置了
$validemail=x
,并且在以后的代码中不使用
$validemail
操作/更改任何内容,那么显然echo
$validemail
将返回
x
。?那有什么不对?要么你没有粘贴一些代码

尝试包装你的prepare语句,绑定参数并在Try、catch块中执行,看看PDO是否抛出任何类型的错误。

执行PDO prepared语句对
$validemail
没有任何影响

$results=$query->execute()之后
,尝试添加
打印($query->fetchAll())
以更好地了解当PHP语句运行MySQL存储过程时从MySQL返回到PHP的内容

请记住,
$results
只是一个布尔值,指示语句是否可以执行。

来自PDO手册:

整元长度

数据类型的长度。 指示参数为输出的步骤 存储过程中的参数,则 必须显式设置长度


您省略了这个参数,这可以解释为什么它没有被用作OUT参数。

我有$validemail=x来检测值的变化,但由于一些不确定的原因,它没有变化。我的storedP从Toad4MySQL返回true或false字符串,但在我的php中,它对有界变量没有任何作用。echo$validemail应返回true/false,但不返回x。但是您在问题中显示的代码没有使用
$validemail
的特定代码,除非插入数据库这是我的sp:CREATE过程
InsertNewUser
(全名varchar(255)、用户名varchar(255)、电子邮件地址varchar(255)的标题,password varchar(255),con_password varchar(255),out validusername varchar(10),out validemail varchar(10),out validkey varchar(155))@Melvin
storedP
是什么意思??很抱歉,我不熟悉Toad4MySQL的功能??请写出理想的输出??我正在使用这个软件:管理我的mysql代码和查询。尝试b4后,它在我的php中仍然不返回任何值,但在Toad上返回。这仍然是必要的,所以你应该保留它以防万一。@Schwartzie和@diEcho,无论如何,谢谢你的反馈。我终于成功了。。但我仍然不明白为什么必须添加“#global”才能让它工作。@Schwartzie,如果它是一个输入/输出参数,它应该会对它产生影响。请看本页的示例#10:再想想,它并没有那么好的指导意义。迈克的答案更合适。好吧,这些想法都不管用。。我仍然无法让它工作,无论我尝试了什么:(我们应该工作,但事实并非如此.)。。