【问题标题】:Correct usage of php PDO with mysql stored routines to fetch table data正确使用 php PDO 和 mysql 存储例程来获取表数据
【发布时间】:2016-09-15 01:33:05
【问题描述】:

我想用两个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 的新手。

【问题讨论】:

  • 我没有得到的东西。你有query("call proc_report") 但你在另一个使用CALL proc_report_filtered(:n_c_from,:n_c_to)。是这 2 个不同的程序,还是您调用了错误的程序?
  • 查看您是否从php.net/manual/en/pdo.error-handling.php 中得到任何信息,并确保这些 POST 数组包含值。
  • $n_c_from$n_c_to 在您的代码中未定义!!
  • @Fred -- 两者都是不同的程序。第一个工作正常,但第二个不工作(proc_report_filtered)
  • 这就是错误报告在这里您的朋友。自从我被轰炸(上周左右)后,我就不再发布它了。但是,嘿...为什么不呢,只是为了过去=>> php.net/manual/en/function.error-reporting.php

标签: php stored-procedures pdo


【解决方案1】:

一般来说,使用 PDO 调用存储过程并没有什么特别之处。 The only issue 可能只影响以下个查询,而不影响当前查询。

因此,您的问题与存储过程无关,而仅与基本 PDO 语法有关:您使用错误的代码来获取记录。这是正确的

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

如果不是问题而是复制/粘贴问题,为了帮助更多的访问者,这里有一个 PDO 调试的简短清单:

  • 第 1 步。 在数据库控制台中运行您的查询,以确保它能够自行运行。
  • 第 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']));
    

【讨论】:

  • 感谢您的回复,它帮助了我一半。我应该如何在 while 循环中再次使用( $report = $records->fetch() )?因为我们已经使用了 $stmt->fetchAll。再次感谢。
  • 感谢您的时间和详细的解释。第 5 步中的小修正。最后一条语句应该是 "$records->execute(array($_POST['n_c_from'],$_POST['n_c_to'])); "
猜你喜欢
  • 2012-09-12
  • 2015-04-21
  • 2015-06-02
  • 2012-11-03
  • 2013-09-10
  • 2014-09-07
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多