正确使用php-PDO和mysql存储例程来获取表数据


Correct usage of php PDO with mysql stored routines to fetch table data

我想用两个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']));