【问题标题】:stored procedure returns empty result存储过程返回空结果
【发布时间】:2015-06-03 12:09:49
【问题描述】:

下面是我的存储过程:

DELIMITER $$
--
-- Procedures
--
DROP PROCEDURE IF EXISTS `checkLogin`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `checkLogin`(IN `uname` VARCHAR(255), IN `pwd` VARCHAR(255))
BEGIN
    SELECT a.id, a.role_id, b.name FROM userTable as a
    LEFT JOIN roleTable as b on b.id = a.role_id 
    WHERE a.username = uname AND password = pwd;
END$$

DELIMITER ;

下面是我的执行代码:

    $stmt = $this->dbCon->prepare("CALL checkLogin(?, ?)");

    $stmt->bindParam(1, $email, PDO::PARAM_STR, 4000); 
    $stmt->bindParam(2, $password, PDO::PARAM_STR, 4000); 

    // call the stored procedure
    $stmt->execute();

    //var_dump($res);
    $op = ( $stmt ) ? $stmt->fetchAll(PDO::FETCH_ASSOC) : '';

    echo '<pre>'; print_r($op); die;

上面$this-&gt;dbCon是我的PDO对象。

当我执行此代码时,我只得到空结果。但是当我通过 phpmyadmin 运行该程序时,它工作正常。

如果我通过命令行执行,即使它工作正常:

我也尝试了以下方法(从答案中收到),但仍然不成功

$stmt = $db->prepare("Call checkLogin(?,?);");
$stmt->execute(array($email,$password));

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (count($rows) == 0)
    echo 'Failed Login!'."\n";
else
    echo 'Logged In...'."\n".print_r($rows,true);

【问题讨论】:

  • 这是因为您的分隔符$$ 正在停止DROP PROCEDURE 行上的过程。 MySQL Stored Procedures 通常,您使用的分隔符不正确,如图所示。
  • @JayBlanchard 创建存储过程没有问题。此外,当我从 phpmyadmin 窗口执行该过程时,它会显示正确的结果。当我通过 pdo 执行时,它显示空结果..

标签: php mysql stored-procedures pdo


【解决方案1】:

你可以试试某些方法,这是另一种直接在execute方法中传递键值参数的方法,命名占位符应该在过程中传递

$stmt = $this->dbCon->prepare("CALL checkLogin(:Email, :Password)");

$keyArray = array("Email"=>"test@test.com","Password"=>"123456");

$stmt->执行($keyArray);

【讨论】:

    【解决方案2】:

    这似乎对我有用。但我没有使用 Bind 参数。绑定似乎也对我有用。我还添加了 PDO 测试。

    代码

    //-- Test if PDO is loaded properly.
    if (extension_loaded ('PDO' )) { 
        echo 'PDO is loaded'."\n";
        if (extension_loaded('pdo_mysql')) 
            echo 'PDO mysql driver is loaded.'."\n"; 
        else 
            echo 'PDO mysql driver is NOT loaded.'."\n";
    } else {
        echo 'PDO is NOT loaded!'."\n";
    }
    
    //-- Run a test
    $email = 'rob@home.net';
    $password = 'abc123!@#';
    
    $db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'toor');
    
    $stmt = $db->prepare("Call checkLogin(?,?);");
    $stmt->execute(array($email,$password));
    
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (count($rows) == 0)
        echo 'Failed Login!'."\n";
    else
        echo 'Logged In...'."\n".print_r($rows,true);
    

    输出:

    PDO 已加载 PDO mysql 驱动程序已加载。 登录... 大批 ( [0] => 数组 ( [id] => 1 [role_id] => 1 [名称] => 编辑 ) )

    【讨论】:

    • PDO 在我的服务器上工作正常,除此之外还有什么要安装的库吗?
    • 您可以使用此处的建议来确保为 PHP 安装了 PDO 和 mysql for PDO。 stackoverflow.com/questions/3131411/…
    猜你喜欢
    • 2012-12-22
    • 2021-03-22
    • 2013-06-21
    • 2023-04-06
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多