我目前正在学习PHP,我是新的面向对象编程。我正在尝试创建一个对象来处理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函数有关,因为当我删除它时,一切都很好。
欢迎提出任何建议。
提前感谢!亚历克斯。
您正在通过转义函数运行整个查询,这正是WRONG要做的事情。这消除了查询语法正确所必需的任何引号。
考虑一下:
INSERT INTO foo (bar) VALUES ('baz')
由于你转义了整个内容,你将这个发送给数据库:
INSERT INTO foo (bar) VALUES (''bar'')
因为这些引号是转义,它们不再是引号了。它们是明文字符,DB正在查找名为'bar'
的字段以从中获取值。你不能在记录中查找字段进行插入,因为你正在插入记录,而它还不存在。并且'bar'
不可能存在于表定义中。
所以你的查询失败了,语法错误,因为你有一个固定的/不变的/无用的"failed"消息,你永远不会被告知失败的原因。
至少把你的die()改成类似
的东西die("Query failed: " . mysqli_error($this->connection));