【问题标题】:PHP PDO error scope?PHP PDO 错误范围?
【发布时间】:2014-05-24 07:50:30
【问题描述】:

我一直在寻找和测试不同的方法来解决我的问题,但我仍然找不到该死的解决方案。我是 PHP 新手,我正在尝试自学使用 PDO。

db.php:

<?php

$dsn = 'mysql:myHost=localhost;dbname=ewt';
$user= 'root';
$pass = '';

try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

showCust.php

<?php

include_once('db.php');

try {


    $sql = "SELECT * FROM PERSOON";
    $result = $pdo->query($sql);
    while($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo $row['VOORNAAM']. ' - '. $row['NAAM']. ' - '. $row['EMAIL']. ' - '. $row['ADRES']. '<br />';
    }
    $pdo = null;
}
catch(PDOException $e) {
    echo $e->getMessage();
}

当我在 showCust.php 中复制 db.php 代码时,它可以完美运行,但我想将数据库连接与其他所有文件分开。我知道它必须与 $pdo 的范围有关,但我就是想不通...

我不断收到的错误是:

注意:未定义变量:pdo ... 第 9 行

致命错误:在 ... 第 9 行中对非对象调用成员函数 query()

我知道数据库没有密码。这纯粹是为了测试目的。

提前致谢!

【问题讨论】:

  • 问题不是mysql:myHost,而是mysql:host=localhost @user3511568。
  • 我用我的凭据测试了你的代码,没有问题。 @user3511568 你确定你正在使用这些文件,你在哪里使用它,在你自己的本地主机或托管服务上?另外,如前所述,使用mysql:host=localhost
  • addCust.php 是否也包含include_once('db.php');?而不是 include_once 使用 include 然后 @user3511568 在这一点上听起来肯定是范围问题。
  • try..catch 对变量范围的影响为零(参见上面的链接重复)。您显示的代码中唯一真正的可能性是该文件未包含在内,期间。这可能是因为您之前已在其他地方包含它并且正在使用 _once(正如 Sense 解释的那样),或者因为该文件不存在并且 include 没有因此而终止脚本。尝试require 而不是include_once。另一种可能性是您展示的示例与您的真实代码无关,而您的真实代码中存在完全不同的问题。

标签: php mysql pdo


【解决方案1】:

本质上,PHP 中的*_once 函数只是一个肮脏的把戏。帮助毫无戒心的程序员保持代码井井有条的拐杖。但没有什么是免费的。

这种“一次”行为意味着您确实在运行此函数一次。
意味着如果您已经包含它一次,那么所有后续调用都将执行...不会。

因此,如果您之前在代码中对 db.php 使用了 include_once,并且它位于函数内部,则 $pdo 变量对于该函数保持本地化,从而使全局范围内没有 $pdo 变量。而当下次包含时,db.php 没有被执行,因此你根本没有 $pdo。
不过,这只是猜测。

其他原因可能是各种拼写错误。还要确保您运行的代码与您在此处发布的代码完全相同。你会惊讶于它的完美运行

【讨论】:

  • 最后一句话几乎是,但不完全是有意义的英语。
  • 是的,我的英语不好。感谢您的关心。
  • 这是一个很好的猜测。我们看到的代码不可能是实际的。 (不过,我们知道通知已启用。)
  • 我一直觉得你的英语很好,只是听不懂你想说什么。如果 $pdo 在函数中关闭,它是该函数的本地函数吗?我正在尝试解析“它”的前因可能是什么,因为我确信那里有一些值得理解的东西。
【解决方案2】:

我怀疑你做了这样的事情:

$pdo = new PDO...;
function foo(){
    $pdo->query(...);
}
foo();

这个怎么样?

$pdo = new PDO...;
function foo(PDO $pdo){
    $pdo->query(...);
}
foo($pdo);

问题也可能反过来发生:

function foo(){
    $pdo = new PDO...;
}
foo();
$pdo->query(...);

您可能在这里发布了一个简化的示例,因为您共享的代码不应触发该通知。我建议您实际上在项目之外尝试简化的 sn-ps。


您刚刚确认了我所说的不是实际代码;-)

我在另一个 PHP 文件中使用了 include_once(addCust.php)。我对此表示怀疑 是一种正确的 PHP 编码方式,但仍在学习中

确保第一次调用include_once('addCust.php)' 不会发生在第一次调用include_once('db.php'); 之前,并且它们都发生在全局范围内。如果您有以下情况,显然也会发生通知:

$pdo->query(...);
$pdo = new PDO...;

【讨论】:

  • 这次不是我 %)
  • 其他时候是? :-O
  • 好吧,这里的所有其他答案...*blush*
  • addCust 不存在。由于沮丧,我输入错误:p
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多