2013-03-26 65 views
0

我创建了一个像这样的存储过程,并用输入参数调用该过程。我想在正常情况下使用echo参数调用它时自己获取过程。调用过程时显示存储过程查询

  $procedure    = "CREATE PROCEDURE pdruser_login(IN userName VARCHAR(300), IN password VARCHAR(500)) 
             BEGIN 
             DECLARE _sqlQuery VARCHAR(2046); 
             SET _sqlQuery = 'SELECT login_id, authorized, admin_authorize FROM tbluser_login WHERE user_name = userName AND user_pwd = password AND authorized = 1 AND privacy_policy = 1 AND is_deleted = 0'; 
             SET @sqlQuery = _sqlQuery; 
             PREPARE dynquery FROM @sqlQuery; 
             EXECUTE dynquery; 
             DEALLOCATE PREPARE dynquery; 
             END;";    
      if (!mysqli_query($this->con,"DROP PROCEDURE IF EXISTS pdruser_login") ||!mysqli_query($this->con,$procedure)) 
       { 
        file_put_contents("minefile1.txt", "Stored procedure creation failed: (" . mysqli_errno($this->con) . ") " . mysqli_error($this->con)); 
       } 
      if (!($result = mysqli_query($this->con,"CALL pdruser_login('".$userName."','".$password."'"))) 
       { 
        file_put_contents("minefile2.txt","CALL failed: (" . mysqli_errno($this->con) . ") " . mysqli_error($this->con)); 
       } 

但上面的程序显示错误“调用失败:(1064)您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的‘’在正确的语法手册第1行“。

如何在调用存储过程时显示存储过程查询。是否有任何获取动态查询的方法,以便于在复杂查询中跟踪错误?

回答

0

出于某种原因,你没有你的SQL存储在一个变量 - 所以,你不能在你的调试信息

$sql = "DROP PROCEDURE IF EXISTS pdruser_login"; 
mysqli_query($this->con,$sql) or trigger_error(mysqli_error($this->con)." [$sql]"); 
$sql = $procedure; 
mysqli_query($this->con,$sql) or trigger_error(mysqli_error($this->con)." [$sql]"); 
// and so on. 

注意trigger_error是一种更有用file_put_contents。它可以把错误放在一个日志文件中,但它也可以在屏幕上显示它非常方便的ID。它有不可或缺的文件/行标记

0

首先创建一个MySQL程序,你需要设置DELIMITER以外的;然后在程序执行后重置分隔符,因为内部所有bock应该视为单个查询,但查询内部过程可以打破sql语句(由于使用;)

来自mysql站点的示例。

DELIMITER // 
DROP PROCEDURE IF EXISTS GetAllProducts // 
CREATE PROCEDURE GetAllProducts() 
BEGIN 
    SELECT * FROM products; 
END // 
DELIMITER ;