【问题标题】:Can't get PHP PDO and OOP classes to work [closed]无法让 PHP PDO 和 OOP 类工作 [关闭]
【发布时间】: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 这样的人的慷慨帮助我找到了解决方案并了解了更多相关信息。

标签: php mysql class oop pdo


【解决方案1】:

我不知道为什么我在那个问题上得了-1?? 我认为它非常完整。

无论如何,感谢@Sean 提供答案的线索。

我的密码中确实有一个 $ 字符。

我的有效连接代码(如上图)是:

$pdo = new PDO('mysql:host=localhost;dbname=my-db-name', 'my-username', 'my-password');

我使用的他们的代码是:

$pdo = new PDO("mysql:host=localhost;dbname=my-db-name", "my-username", "my-password");

" 字符更改为' 立即生效。 密码是由我的主机 (Plesk) 自动生成的,我对 PHP 的了解还不够,无法知道 '" 之间存在差异。我从来不知道为什么有些人使用一种而有些人使用另一种。看来我还有很多东西要学。

@Sean,因为你没有把它作为回复,所以我无法选择你的建议作为答案,所以我不知道如何给你积分,但非常感谢你指导我正确的方向。

【讨论】:

  • 您可以在php.net/language.types.string 了解更多关于 php 如何处理单引号和双引号的信息。例如,$x = 2; $y ='$x'; echo $y; // returns $x$x = 2; $y ="$x"; echo $y; returns 2The most important feature of double-quoted strings is the fact that variable names will be expanded.
  • 感谢@Sean 现在阅读。
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2014-10-05
  • 2012-03-09
  • 2012-09-15
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多