【问题标题】:Why i got in PDO always boolean error?为什么我进入 PDO 总是布尔错误?
【发布时间】:2018-07-11 13:16:02
【问题描述】:

我有一个 mySQL 类来连接和执行我的查询进出数据库。当我连接到数据库时,一切正常。当我尝试将某些内容放入数据库时​​,也可以,但是当我尝试从中获取某些内容时,无论输入如何,都会出现布尔(真)错误。我假设它必须返回一个对象,但它返回一个布尔值。为什么会这样?

我的代码如下所示:

class Database {

function __construct() { 
    // пустой инициализатор 

    $this->set_connection(); // нужно ли автоматически инициализировать?
}

private $dbchar = "UTF8";
private $dbuser = "admin";
private $dbpass = "1234";
private $dbhost = "localhost";
private $dbname = "core_db";
private $dbpref = "pre_";

private $link;

private function set_connection() {

    $dsn = "mysql:host=".$this->dbhost.";dbname=".$this->dbname.";charset=".$this->dbchar;

    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        //PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
        // Выключает режим эмуляции! если у вас проблемы с LIMIT ?,?
        PDO::ATTR_EMULATE_PREPARES   => TRUE
    );
    try {
        $this->link = new PDO($dsn, $this->dbuser, $this->dbpass, $opt);
        if (!$this->link) throw new Exception("Cannot connect to database!", 4);

    } catch (Exception $e) {
        die("Error! " . $e->getMessage());
    }
}

// Получаем ссылку на соединенние с базой 

function get_connection() {

    return $this->link; 
}

/*
    НЕ УДАЛЯТЬ ---------------------------------------------------------
    Запросы можно использовать вот так.................!
    # просто испольняет SQL запрос // INSERT. DELETE OR UPDATE
    $this->execute_query($sql); 
    $this->execute_query($sql, $data);  
    # all rows
    $result = $this->execute_query($sql, $data)->fetchAll();
    foreach ($result as $row) echo $row['name'];
    # one row
    $row = $this->execute_query($sql, $data)->fetch();
    # one cell
    $count = $this->execute_query($sql)->fetchColumn(); // можно использовать для подсчета ячеекы
    # column
    $ids = $this->execute_query($sql)->fetchAll(PDO::FETCH_COLUMN);
    НЕ УДАЛЯТЬ ---------------------------------------------------------
*/

// метод выполнения запроса SQL !!!
// Использ.  $sql = SELECT * FROM table WHERE a = ? and b = ?
// Использ.  $data = array('a', 'b');

function execute_query($sql, $elements=false) {

    $error_exist = false;
    $data = false;

    try {
        if (empty($sql)) throw new RuntimeException('no SQL!');

        $stmt = $this->get_connection()->prepare($sql);

        if (!$stmt) throw new RuntimeException('SQL preparing failure!');

        if (!$elements) {
            $data = $stmt->execute();
        } else {
            $data = $stmt->execute($elements);
        }

        if (!$data) throw new RuntimeException('SQL execution failure!');

    } catch (Exception $e) {
        $error_exist = true;
        $data = $e->getMessage();
    }

    return array('error' => $error_exist, 'result' => $data);
}



// Закрываем соединение с базой
function close_connection() {
    $this->link = null;
}

function __destructor() {
    $this->close_connection();
}

}

index.php 文件本身显示在此处:

$sql = "SELECT * FROM prava WHERE test_id = ?";

$r = $db->execute_query($sql, ['1']);

var_dump($r);

【问题讨论】:

  • 请提供错误代码和信息。来自 pdo 对象的实际错误代码和消息。不是您自己没有用的自定义消息。
  • 打开手册php.net/manual/ru/…
  • boolean (true) 对于成功执行是正确的。你的$r 可能是一个结果对象,获取它。 php.net/manual/en/pdostatement.execute.php ... Returns TRUE on success.
  • 我怎样才能得到它们???我尝试设置 PDO 的 errorInfo() 但它不是可读数组(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL }

标签: php mysql mysqli pdo


【解决方案1】:

最后解决这个问题:

那么我做错了什么?我返回执行结果,但我需要返回一个对象然后进行 fetch() Daaammnnn..

感谢@user3783243

所以这段代码:

   if (!$elements) {
        $data = $stmt->execute();
    } else {
        $data = $stmt->execute($elements);
    }

必须是这个代码:

   if (!$elements) {
        $data = $stmt->execute();
        return $data;
    } else {
        $stmt->execute($elements);
        return $stmt // and then get a fetch from object 
    }

例如。

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2016-08-14
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2017-06-25
    • 2011-01-29
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多