如何使用 pdo 执行功能来选择表?

Posted

技术标签:

【中文标题】如何使用 pdo 执行功能来选择表?【英文标题】:How do I use pdo execute function to select table? 【发布时间】:2019-05-30 04:13:07 【问题描述】:

index.php

<?php
require_once 'core/init.php';
DB::getInstance()->query("SELECT * FROM users");

在这个类中,我使用的是单例模式,它已成功连接到数据库。

DB.php

<?php
class DB

private static $_instance = null;
private $_pdo, $_query, $_error = false, $results, $count = 0;    
private function __construct()
  try
 $this->_pdo = new PDO('mysql:host='.Config::get('mysql/host') .';db='.Config::get('mysql/db'),Config::get('mysql/username'),Config::get('mysql/password'));
     //echo "Connected";
    catch(PDOException $e)
        die($e->getMessage());
    


public static function getInstance()

     if(!isset(self::$_instance))
         self::$_instance = new DB();
     
     return self::$_instance;


public function query($sql)
    $this->_error = false;

    if($this->_query = $this->_pdo->prepare($sql))
     //  echo 'prepared statement';

       if($this->_query->execute())
         echo 'do query';
       else
         echo 'did not execute';
       
    
  
 

现在的问题是当我在query() 中传递 sql 查询时,它属于 else 条件“未执行”。所以我的问题是为什么它不执行。 pdo 中是否存在与 mysql db 的兼容性问题,或者我做错了什么。

【问题讨论】:

你仔细看看这里了吗? phpdelusions.net/pdo_examples/select 或这里,w3schools.com/php/php_mysql_select.asp 我建议先创建一个工作示例,而不是先将其包装在一个类中。您还应该阅读如何在进行查询时检查错误。 TBH,我宁愿推荐使用久经考验的 db-library 而不是自己构建。 你应该使用已经存在的包装类而不是创建你自己的。您可以使用我的课程GrumpyPDO(显然我个人推荐),但还有更多类似的dozensifnothundreds。真的没有必要重新发明*** 【参考方案1】:

我总是启用 PDO 异常。如果查询或对 PDO 函数的任何其他调用出现问题,它将引发包含错误消息的异常。

$this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

(您只需设置一次,通常在您创建 PDO 连接之后。)

见http://php.net/manual/en/pdo.error-handling.php

如果您不想使用异常,则应在每次调用query()prepare()execute()后检查错误,并将它们输出到错误日志。

$this->_query = $this->_pdo->prepare($sql);
if ($this->_query === false) 
   $this->_error = $this->_pdo->errorInfo();
   error_log("Error '$this->_error[2]' when preparing SQL: $sql");
   return false;

$ok = $this->_query->execute();
if ($ok === false) 
   $this->_error = $this->_query->errorInfo();
   error_log("Error '$this->_error[2]' when executing SQL: $sql");
   return false;

【讨论】:

我认为$ok = $this-&gt;_query-&gt;execute; 没有返回布尔逻辑。你的第二个if 没有变假,也没有显示错误日志。 即使我在构造函数中删除了我的 try-catch PDOStatement::execute Returns TRUE on success or FALSE on failure.

以上是关于如何使用 pdo 执行功能来选择表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pdo 检查表是不是存在 [重复]

如何加快 PDO 查询

使用 PDO 时如何获取原始表/列名?

如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID

如何正确使用 PDO 对象进行参数化 SELECT 查询

PDO fetchAll 数组到一维