PHP OOP 学习曲线 - MySQL 对象失败

标签 php mysql oop

<分区>

我目前正在学习 PHP,并且是 OOP 的新手。我正在尝试创建一个对象来处理 MySQL 查询和连接。

这是我到目前为止创建的:

class MySQLDatabase {

    private $connection;

    function __construct() {
        $this->open_connection();
    }

    public function open_connection() {
        $this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
        if(mysqli_connect_errno()) {
            die(
                "Database connection failed: " . mysqli_connect_error() . 
                " (" . mysqli_connect_errno() . ")"
            );
        } 
    }

    public function close_connection() {
        if(isset($this->connection)) {
            mysqli_close($this->connection);
            unset($this->connection);
        }
    }

    public function query($sql) {
        $cleaned_sql = mysqli::real_escape_string($sql);
        $result = mysqli_query($this->connection, $cleaned_sql);
        $this->confirm_query($result);
        return $result;
    }

    public function mysql_prep($string) {           
        $escaped_string = mysqli_real_escape_string($this->connection, $string);
        return $escaped_string;
    }

    private function confirm_query($result) {
        if (!$result) {
        die("Database query failed.");
        }
    }
}

在面向公众的方面(进行测试以确保一切按预期工作):

$sql = "INSERT INTO users (id, username, password, first_name, last_name) ";
$sql .= "VALUES (1, 'jbloggs', 'secretpwd', 'Joe', 'Bloggs')";
$result = $database->query($sql);

目前,我只得到以下输出: 数据库查询失败。

问题似乎与我的 mysql_prep 函数有关,因为当我删除它时一切正常。

非常欢迎任何建议。

提前致谢! 亚历克斯。

最佳答案

您正在通过转义函数运行整个查询,这完全是错误的做法。这消除了查询语法正确所需的任何引号。

考虑一下:

INSERT INTO foo (bar) VALUES ('baz')

因为你要转义整个事情,所以你要将它发送到数据库:

INSERT INTO foo (bar) VALUES (\'bar\')

因为这些引号是转义的,所以它们不再是引号了。它们是明文字符,数据库正在寻找名为 'bar' 的字段以从中获取值。您无法在记录中查找要插入的字段,因为您正在插入记录,但它尚不存在。并且 'bar' 不太可能存在于您的表定义中。

因此您的查询因语法错误而失败,并且由于您有固定/不变/无用的“失败”消息,因此您永远不会被告知失败的原因。

至少把你的 die() 改成类似的东西

die("Query failed: " . mysqli_error($this->connection));

关于PHP OOP 学习曲线 - MySQL 对象失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39647966/

相关文章:

c++ - 一个 header 中的基类和派生类

PHP: stmt->execute() 失败,但错误为空

javascript - 使用 ajax 和 PHP 根据第一个选择框填充第二个选择框

PHP 反转 MySQL 数据库结果的顺序

Java MySQL JDBC 驱动程序异常

MySQL : foreign key error

matlab - 初始化子类对象数组会创建异构父类(super class)数组

javascript - 为什么编写功能组件时应该将 React 纳入范围?

php - 在 Laravel 3 中,带有自定义表的模型不会保存

mysql - 复杂的SQL语句