【问题标题】:php/mysql oop using prepared statement reviewphp/mysql oop 使用准备好的语句审查
【发布时间】:2012-02-20 15:33:54
【问题描述】:

我正在尝试执行准备好的语句,但由于某种原因我无法创建用户。请注意,我已经能够在旧的传统 fation [mysql_connect 和 ...] 中创建具有相同值的用户可以帮助我确定我在哪里犯了错误吗?

require_once 'config.php';
class AuthDb {
private $db;
function __construct(){
    $this->db = mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME) 
                or die('could not connect');        
}

function __destruct(){

    $this->db->close();
    unset($this->db);
}

public function createUser($name, $email) {

    $query = "INSERT INTO myUsers (name, email) VALUES (?, ?)";
    $stmt = $this->db->prepare($query); 
    $stmt->bind_param("ss", $name, $email);
    if ($stmt->execute()){
        return true;
    }

    return false;

  }

}

$create = new AuthDb();
$name = "bing";
$email = "banbang@yahoo.com"; 
$test = $create->createUser($name, $email);

【问题讨论】:

  • $this->db = mysqli(DB_SERVER - 你忘了new吗?
  • mysqli 是一个函数,为什么要实例化它?
  • 我只是好奇,因为有一个名为 mysqli 的类和 config.php 听起来不像它会提供一个名为 mysqli(...) 的函数 ;-)
  • 你其实是对的,我必须在mysqli(...)之前添加新的。我进行了更改,但仍然无法插入数据库。
  • 在这种情况下,new mysqli... or die(...) 将无法按预期工作。即使连接失败,您也会得到一个“有效”的 mysqli 对象。您必须检查$this->db->error 和/或$this->db->errno。请参阅 docs.php.net/mysqli.construct(或改用 PDO)。

标签: php oop mysqli prepared-statement


【解决方案1】:

尝试更多错误处理/记录。

define('DEBUG_LOG', true);
function onError($general, $details) {
    echo '<pre>', htmlentities($general), "</pre>\n";
    if ( defined('DEBUG_LOG') && DEBUG_LOG ) {
        echo '<pre>', htmlentities($details), "</pre>\n";
        echo '<pre>'; debug_print_backtrace(); echo "</pre>\n";
    }
    die;
}

class AuthDb {
[...]
    public function createUser($name, $email) {
        $query = "INSERT INTO myUsers (name, email) VALUES (?, ?)";
        $stmt = $this->db->prepare($query);
        if ( !$stmt ) {
            onError('database error', $this->db->errno .': '.$this->db->error);
            return false;
        }

        $rc = $stmt->bind_param("ss", $name, $email);
        if ( !$rc ) {
            onError('database error', 'bind failed');
            return false;
        }

        if ( !$stmt->execute() ) {
            onError('database error', $stmt->errno.': '.$stmt->error );
            return false;
        }

        return true;
    }

【讨论】:

  • 感谢您的帮助,我终于能够将姓名和电子邮件添加到数据库中。这是一个很好的调试机制,我要多学习OOP,专门用来调试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多