- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我在将我的应用程序从旧的 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/
PHP查询: prepare('SELECT * FROM Locations WHERE user_id = :id LIMIT 0, 5'); $query->bindParam(":id
到目前为止我一直在使用 PDO->bindParam 但是在阅读手册时我发现 PDO->bindValue 我可以告诉 PDO->bindValue 按值传递,而 PDO->bindParam 按引用
我使用PDO进行MySQL数据库连接、选择、更新和删除。 但是我在选择带有特殊字符的行时遇到问题,例如,我想选择带有“Judge-Fürstová Mila”的页面标题, 表页, id titl
我使用的是 PHP 5.2.9 和 Apache 2.2.11 以及 mysql 5.1.32 为什么我不能禁用 PDO::ATTR_EMULATE_PREPARES ? 下面是代码: false)
当 PDO::ATTR_PERSISTENT = true 时,PDO::exec 和 PDO::query 之间似乎存在差异。当使用PDO::exec时,连接将不会被重用,并最终导致MySQL出现“
我正在尝试调整 Zend Skeleton App 以使用 ODBC 连接。我能够在 Zend 之外设置 PDO 连接(同一个表、服务器、所有内容),如下所示: new PDO('odbc:DRIVE
我正在使用 XAMPP 3.2.1 在 Windows 7 上使用 PDO,但在使其正常工作时遇到问题,即使它可以在我的共享托管服务器。 settings.php db.php setAttribu
我正在尝试使用以下代码从 get 变量中获取结果,我使用了另一个代码(在下面列出)并且它有效但是在使用它时无法逃脱,我不知道我有什么做错了,但我需要帮助,我刚刚开始 PDO,所以是的,我是个白痴 :D
我有这个代码 try { $dbh = new PDO('mysql:host=localhost;dbname=db_informations', 'root', ''); $dbh
在我的本地开发机器 (MAMP) 上,我的 MySQL 查询返回正确的大小写。但是,在我的共享托管服务器上,使用 fetch(PDO::FETCH_ASSOC); 时,我的结果是小写的 我试过以下方法
我正在使用这个 PDO 连接: try{ $db=new PDO(" mysql:host=localhost; dbname=...", "dbu...", "pass", array(PDO::M
我需要将 PDO 连接从 controller 传递到 cart 类, function __construct($connection) { $this->cart = new cart($
位于 PHP.net 的 PDO 交易示例表明 PDO::exec() 是事务处理的,但是没有这样的例子使用 PDO::query()。 事务是否涵盖 PDO::query()? 此外,据我所知,PD
几天来我一直在使用来自 http://www.mamp.info 的 MAMP Pro 3.07 . 很棒的工具,一切正常。 但是现在我遇到了问题,对于一个新项目,我需要连接到 MSSQL。 我在 w
我正在尝试在我的 PHP 代码中使用 PDO 模块来连接到数据库。我已经阅读并搜索了类似的主题,但我无法弄清楚我做错了什么。请帮我解决问题。 Apache版本:Apache/2.2.21 (Win32
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我使用 PDO 连接到我的数据库,我不知道哪种方法比更新、删除和插入、PDO::exec 或 PDO::excute 的另一种方法更好。我应该使用哪个? 最佳答案 虽然这两种方法具有相似的命名(exe
如何在 Codeigniter 中设置 PDO 数据库句柄的属性(PDO::ATTR_ERRMODE)? 最佳答案 我认为更好的选择是使用 MY_Model(然后您对其进行扩展,然后它在整个应用程序中
从 mysql 切换到 PDO 我注意到 fetch 方法改变了 PDO 对象本身!例如: $res=$ps->fetchAll(); echo($res[0]['Mail']); //it'ok /
嗨,我正在使用 PDO 为 mysql 开发一个基本的数据库连接类,但是当我 var dump 返回结果时,它告诉我我有 2 个对象:object(PDO)[2]。不应该只有一个吗? 这是迄今为止我的
我是一名优秀的程序员,十分优秀!