gpt4 book ai didi

php - 将 mysql 转换为 PDO 的问题

转载 作者:行者123 更新时间:2023-11-29 00:12:49 25 4
gpt4 key购买 nike

所以我在将我的应用程序从旧的 mysql 语法转换为 PDO 时遇到了一些麻烦。

这是我到目前为止尝试过的,旧的 mysql 行被注释掉了。

db_connect.php
<?php

class DB_Connect {

// constructor
function __construct() {

}

// destructor
function __destruct() {
// $this->close();
}

// Connecting to database
public function connect() {
require_once 'config.php';
// connecting to mysql
try {
$pdo = new PDO('mysql:host=localhost;dbname=gcm', DB_USER, DB_PASSWORD);
}
catch (PDOException $e) {
$output = 'Unable to connect to database server.' .
$e->getMessage();
exit();
}

// $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
// selecting database
//mysql_select_db(DB_DATABASE);

// return database handler
return $pdo;
}

// Closing database connection
public function close() {
$pdo = null;
}

}
?>

这是我的 db_functions 类,所有 CRUD 操作都在其中发生,我在其中使用 db_connect 类返回我可以使用的连接

db_functions.php
<?php

class DB_Functions {

private $db;

// constructor
function __construct() {
include_once './db_connect.php';
// connecting to database
$this->db = new DB_Connect();
$this->db->connect();
}

// destructor
function __destruct() {

}

public function storeUser($name, $email, $gcm_regid) {
//insert user into database
try {
$sql = "INSERT INTO gcm_users(name, email, gcm_regid, created_at) VALUES('$name', '$email', '$gcm_regid', NOW())";
$result = $db->query($sql);
if ($result) {
// get user details
$id = $db->lastInsertId(); //last inserted id
$sql = "SELECT * FROM gcm_users WHERE id = $id";
$result = $db->query($sql);
$no_of_rows = $result->fetchColumn();
// return user details
if ($no_of_rows > 0) {
return $result->fetch(PDO::FETCH_ASSOC);
} else {
return false;
}
} else {
return false;
}
}
catch (PDOException $e) {
$error = 'Error storing user: ' . $e->getMessage();
}
}


/* // insert user into database
$result = mysql_query("INSERT INTO gcm_users(name, email, gcm_regid, created_at) VALUES('$name', '$email', '$gcm_regid', NOW())");
// check for successful store
if ($result) {
// get user details
$id = mysql_insert_id(); // last inserted id
$result = mysql_query("SELECT * FROM gcm_users WHERE id = $id") or die(mysql_error());
// return user details
if (mysql_num_rows($result) > 0) {
return mysql_fetch_array($result);
} else {
return false;
}
} else {
return false;
}
}
*/

//Get user by email or password
public function getUserByEmail($email) {
try {
$sql = "SELECT * FROM gcm_users WHERE email = '$email' LIMIT 1";
$result = $db->query($sql);
return $result;
}
catch (PDOException $e) {
$error = 'Error fetching user by email: ' . $e->getMessage();
}
// $result = mysql_query("SELECT * FROM gcm_users WHERE email = '$email' LIMIT 1");

}

//Returns all users
public function getAllUsers() {
try {
$sql = "select * FROM gcm_users";
//$result = mysql_query("select * FROM gcm_users");
$result = $db->query($sql);
return $result;
}
catch (PDOException $e) {
$error = 'Error getting all users: ' . $e->getMessage();
}
}



//Check if user exists
public function isUserExisted($email) {
try {
$sql = "SELECT email from gcm_users WHERE email = '$email'";
$result = $db->query($sql);
$no_of_rows = $result->fetchColumn();


//$result = mysql_query("SELECT email from gcm_users WHERE email = '$email'");
//$no_of_rows = mysql_num_rows($result);
if ($no_of_rows > 0) {
// user existed
return true;
} else {
// user not existed
return false;
}
}
catch (PDOException $e) {
$error = 'Error fetching user by email: ' . $e->getMessage();
}
}

我只使用 db_connect 类测试了代码,它似乎可以正常连接到数据库,但是当我开始更新 db_functions 类时,我得到了错误

Notice: Undefined variable: db in C:\xampp\htdocs\gcm\db_functions.php on line 84

Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\gcm\db_functions.php on line 84

这是第 84 行

   public function getAllUsers() {
try {
$sql = "select * FROM gcm_users";
//$result = mysql_query("select * FROM gcm_users");
$result = $db->query($sql); //Line 84
return $result;

这似乎与它没有将 $db 识别为表示从 db_connect 中的 connect() 方法返回的 PDO 连接对象有关。有什么办法可以解决这个问题吗?

编辑:

尝试一起摆脱 db_connect.php 并在 db_functions.php 中创建 PDO 连接

class DB_Functions {

private $db;

// constructor
function __construct() {
require_once 'config.php';
// connecting to mysql
try {
$this->$db = new PDO('mysql:host=localhost;dbname=gcm', DB_USER, DB_PASSWORD);
}
catch (PDOException $e) {
$output = 'Unable to connect to database server.' .
$e->getMessage();
exit();
}
}

// destructor
function __destruct() {

}

//Returns all users
public function getAllUsers() {
try {
$sql = "select * FROM gcm_users";
//$result = mysql_query("select * FROM gcm_users");
$result = $this->$db->query($sql);
return $result;
}
catch (PDOException $e) {
$error = 'Error getting all users: ' . $e->getMessage();
}
}

现在出现错误:

Notice: Undefined variable: db in C:\xampp\htdocs\gcm\db_functions.php on line 12

Fatal error: Cannot access empty property in C:\xampp\htdocs\gcm\db_functions.php on line 12

这是第 12 行:

$this->$db = new PDO('mysql:host=localhost;dbname=gcm', DB_USER, DB_PASSWORD);

我尝试使用此处列出的第一个答案中的大纲:How do I create a connection class with dependency injection and interfaces?

最佳答案

您没有将 $this->db->connect() 的结果存储到您以后可以使用的任何变量中,因此您的类从一开始就没有引用任何数据库连接。

然后您也没有正确引用(应该是什么)$this->db 处的数据库连接,而只是调用 $db->*

你有一种使用单例的错误构思方法,但我建议只使用依赖注入(inject)。因此,也许放弃使用 DB_Connect 类并简单地将 PDO 对象直接注入(inject)到您的 DB_Function 类(它应该被正确地称为 user 类)。

class DB_Functions {

// note I changed this to protected in case you actually decide
// to change class name to something meaningful like "user"
// and want to ever subclass it
protected $db;

// constructor
function __construct(PDO $pdo) {
$this->db = $pdo;
}

// rest of your class
// make sure you replace $db->* references with $this->db->*
}

这会做一些事情。如果未传入正确实例化的 PDO 对象,它实际上将无法实例化 DB_Functions 对象。您正在将依赖项(具有有效的 PDO 对象)“注入(inject)”到此类中。没有它,对象实例化将失败,这可能是一种理想的行为,因为如果没有有效的数据库连接,则实例化该对象是没有用的。

这也有助于将您的“用户”逻辑与数据库实例化逻辑分离。毕竟,为什么这个用户类需要知道如何去实例化一个 PDO 对象。代码的其他部分应该处理 PDO 连接的设置并将其传递进来,这样在以后的某个时刻,当您想停止使用 DB_Connect 转而使用其他 PDO 提供程序时,您会然后不需要更改此类和其他类似的类来引用一些新的 PDO 提供程序类。

关于php - 将 mysql 转换为 PDO 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252310/

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