存储过程 returns 空结果
stored procedure returns empty result
下面是我的存储过程:
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->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);
这似乎对我有用。但是我没有使用 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 is loaded
PDO mysql driver is loaded.
Logged In...
Array
(
[0] => Array
(
[id] => 1
[role_id] => 1
[name] => edit
)
)
你可以尝试某些方法,这是另一种在执行方法中直接传递键值参数的方法,命名占位符应该在过程中传递
$stmt = $this->dbCon->准备("CALL checkLogin(:Email, :Password)");
$keyArray = array("Email"=>"test@test.com","Password"=>"123456");
$stmt->执行($keyArray);
下面是我的存储过程:
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->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);
这似乎对我有用。但是我没有使用 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 is loaded PDO mysql driver is loaded. Logged In... Array ( [0] => Array ( [id] => 1 [role_id] => 1 [name] => edit ) )
你可以尝试某些方法,这是另一种在执行方法中直接传递键值参数的方法,命名占位符应该在过程中传递
$stmt = $this->dbCon->准备("CALL checkLogin(:Email, :Password)");
$keyArray = array("Email"=>"test@test.com","Password"=>"123456");
$stmt->执行($keyArray);