gpt4 book ai didi

php - 创建一个 PHP PDO 数据库类,OOP 的麻烦

转载 作者:可可西里 更新时间:2023-11-01 00:33:12 25 4
gpt4 key购买 nike

这是我当前的数据库类:

class Database {

private $db;

function Connect() {
$db_host = "localhost";
$db_name = "database1";
$db_user = "root";
$db_pass = "root";
try {
$this->db = new PDO("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user, $db_pass);
} catch(PDOException $e) {
die($e);
}
}

public function getColumn($tableName, $unknownColumnName, $columnOneName, $columnOneValue, $columnTwoName = "1", $columnTwoValue = "1") {
$stmt = $this->db->query("SELECT $tableName FROM $unknownColumnName WHERE $columnOneName='$columnOneValue' AND $columnTwoName='$columnTwoValue'");
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $results[0][$unknownColumnName];
}
}

我正在尝试使用以下代码运行它:

$db = new Database();
$db->Connect();
echo $db->getColumn("Sessions", "token", "uid", 1);

我收到以下错误:

PHP Fatal error: Call to a member function fetchAll() on a non-object in /Users/RETRACTED/RETRACTED/root/includes/Database.php on line 19

知道发生了什么事吗?谢谢

最佳答案

  1. 此函数容易出现SQL注入(inject)
  2. 此函数不会让您使用最简单的 OR 条件获取列
  3. 此函数从几乎自然的 SQL 语言英语中生成不可读的乱码

看,写这个函数你甚至把自己宠坏了。您认为它如何用于日常编码?事实上,与使用原始 PDO 相比,此功能使您的体验更难 - 您必须学习所有新语法、大量异常和最后一刻的更正。

请转回原始 PDO!

让我告诉你正确的方法

public function getColumn($sql, $params)
{
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
return $stmt->fetchColumn();
}

像这样使用

echo $db->getColumn("SELECT token FROM Sessions WHERE uid = ?", array(1));

通过这种方式,您将能够使用SQL 的全部功能,而不仅限于愚蠢的子集,以及准备好的语句的安全性,同时保持您的代码可以理解。
虽然仍然在一行中 调用它 - 这是您最初(并且非常正确!)的意图。

关于php - 创建一个 PHP PDO 数据库类,OOP 的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18326481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com