【发布时间】:2015-07-22 20:13:19
【问题描述】:
我正在尝试学习如何将 PHP PDO 用作面向对象的编程。
我已尝试遵循以下两个教程: http://culttt.com/2012/10/01/roll-your-own-pdo-php-class/ http://culttt.com/2012/09/24/prevent-php-sql-injection-with-pdo-prepared-statements/
但我无法让它们中的任何一个工作。
第二个提供了从http://www.imavex.com/php-pdo-wrapper-class/ 到预先编写的包装类class.db.php 的下载链接
使用这个预先编写的包装类并尝试像 tutorial.php 这样简单的东西(凭据已更改):
// Include the database class
include("class.db.php");
// Connect to database
$db = new db("mysql:host=localhost;dbname=my-db-name", "my-username", "my-password");
$results = $db->select("ad_publication");
print_r($results);
上面显示的是一个空白页面。
我知道预写的课和上面例子的文字没有错,因为它是直接从教程中复制出来的,cmets充满了感谢和赞美。
我知道我的凭据没有任何问题,因为它可以正常工作:
try
{
$pdo = new PDO('mysql:host=localhost;dbname=my-db-name', 'my-username', 'my-password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMES "utf8"');
$output = 'Connection Successful';
echo $output;
}
catch (PDOException $e)
{
$output = 'Unable to connect to the database server.' . $e->getMessage();
echo $output;
exit();
}
并输出Connection Successful
我的服务器正在运行 PHP 5.5,上面示例中使用的表是 InnoDB 表。
当我运行示例选择语句时,我的错误日志显示:
PHP 声明:未定义变量:GhG678 在 /var/www/vhosts/mywebsite.com.au/httpdocs/booking/tutorial.php 第 7 行
第 7 行:
$db = new db("mysql:host=localhost;dbname=my-db-name", "my-username", "my-password");
PHP 警告:在第 18 行的 /var/www/vhosts/mywebsite.com.au/httpdocs/booking/class.db.php 中从空值创建默认对象
第 18 行:
$this->error = $e->getMessage(); // (from public function __construct)`
PHP 致命错误: 在线调用 /var/www/vhosts/mywebsite.com.au/httpdocs/booking/tutorial.php 中非对象的成员函数 select() 9
第 9 行:
$results = $db->select("ad_publication"); // (an existing table with data in it)
我只是看不出我做错了什么,尤其是包装类不是我写的,没有其他人抱怨它(赞不绝口),tutorial.php 的内容直接复制自只更改了表名的页面。
就像我说的,使用 PDO 连接并在没有包装类的情况下执行正常的 PDO 查询,工作正常。
这里的任何人都可以看到任何可能出错的地方或知道我应该查看的任何内容吗?
【问题讨论】:
-
所以你提供了教程的链接,而不是你的
class.db.php?由于您的代码发生了错误,您不认为显示这一点会有所帮助吗? -
我猜你在
tutorial.php的版本中犯了一个错误,因为PHP 所说的未定义的变量名看起来很像密码。您应该在此处发布您的代码,而不是声称没有任何问题。 -
"my-username"或"my-password"看起来像"$GhG678"吗?你忘了删除$,所以它认为GhG678是一个var$GhG678而不是一个字符串? -
你说“上面显示的是空白页”。这表示致命错误。您应该将
error_reporting(E_ALL);放在页面顶部,这应该会告诉您那里出了什么问题。 -
RE:暂停。现在知道它是由于缺乏对语法的理解造成的,因此很难编辑这个问题以使其更符合主题。特别是因为问题出在密码内,(不包括在内)所有代码和错误日志都包括在内,除了文件 class.db.php 由其他人编写并公开可用(提供链接),这不是问题。我已经阅读了帮助中心的链接,但不知道如何才能使它更符合主题。我很高兴我在这里发布了这个问题,并且像 @Sean 这样的人的慷慨帮助我找到了解决方案并了解了更多相关信息。