我想用两个in参数调用mysql存储过程,比如from和to,并在表中打印数据。我使用了以下代码:
try
{
$age_from = $_POST['from'];
$age_to = $_POST['to'];
$stmt = $db->prepare("CALL proc_report_filtered(:age_from,:age_to)");
$stmt->bindParam(':age_from',$age_from);
$stmt->bindParam(':age_to',$age_to);
$records = $stmt->execute();
$records->setFetchMode(PDO::FETCH_ASSOC);
}
catch (PDOException $e)
{
die("Some problem getting data from database !!!" . $e->getMessage());
}
后来,我像以前一样使用while循环来打印表数据。
while ( $report = $records->fetch() )
存储例程proc_report_filtered是一个简单的查询,用于获取年龄范围之间的数据,如下所示:
select * from employee where age in between 30 and 40;
其中30是$age_from,40是传递到存储例程的$age_to。
不幸的是,代码不起作用。请纠正我哪里出了问题。我是使用php-PDO的新手。
通常,使用PDO调用存储过程本质上没有什么特别之处。唯一的问题可能只影响以下查询,但不会影响当前查询。
因此,您的问题与存储过程无关,而仅与基本的PDO语法有关:您使用了错误的代码来获取记录。正确的来了
$stmt->execute();
$records = $stmt->fetchAll(PDO::FETCH_ASSOC);
如果这不是问题,而是复制/粘贴问题,为了帮助更多的访问者,这里有一个PDO调试的简短检查列表:
- 步骤1.在DB控制台中运行查询,以确保其自身正常工作
步骤2.确保您可以看到所有PHP错误。
error_reporting(E_ALL); ini_set('display_errors', 1); // for the dev server only
步骤3.通过添加以下代码,确保您的PDO抛出异常
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
第4步。使用
PDO::query()
,在不准备语句的情况下运行查询,并手动编写值:$stmt = $db->query("CALL proc_report_filtered(30,40)");
步骤5.使用准备好的语句以简化的形式运行,以消除所有可能的拼写问题:
$stmt = $db->prepare("CALL proc_report_filtered(?,?)"); $stmt->execute(array($_POST['from'],$_POST['to']));