【问题标题】:Can a web host stop pdo->prepare() from running?网络主机可以阻止 pdo->prepare() 运行吗?
【发布时间】:2017-07-29 23:28:00
【问题描述】:

我在 pdo->prepare() 上搜索了几个答案,但这些答案都没有完全解决我遇到的情况。

我刚刚将客户网站的网络主机更改为 1and1。在我的本地机器上进行开发的工作不适用于 1and1 托管服务器。是的,PDO 在那里,PHP 版本 7.0 已安装并运行。

这是我的 DBClass

class DBClass {

    public static function dbConnect () {
        $host_name = "host";
        $database = "db";
        $user_name = "un";
        $password = "pw";
        try {
           return new PDO("mysql:host=$host_name; dbname=$database;", $user_name, $password);
        } catch (PDOException $e) {
          return "Error!: " . $e->getMessage() . "<br/>";
          die();
        }
    }
}

这是我的处理程序中生成此站点上所有页面的代码。

$dbConn = DBClass::dbConnect();
echo "<h3>Standard PDO using dbh->query</h3>";
$stmt = $dbConn->query("SELECT * FROM vfs");
$recs = $stmt->fetchAll();
foreach ($recs as $rec) {
    echo "id: " . $rec['id'] . ", parent: " . $rec['parent'] . ", url: " . $rec['url'] . ", short_url: " . $rec['short_url'] . " title: " . $rec['title']  . "<br />";
}
echo "<h3>Running dbh->prepare</h3>";
$pstmt = $dbh->prepare("SELECT * FROM vfs WHERE url = :url || short_url = :url");
$pstmt->bindParam(':url', $_SERVER['REQUEST_URI'], PDO::PARAM_STR, 255);
$pstmt->execute();

$vfsCnt = $pstmt->rowCount();

if($pstmt->rowCount() == 1){
    $pgRec = $pstmt->fetch(PDO::FETCH_ASSOC);
    $pstmt = $dbConn->prepare("SELECT * FROM templates WHERE id = ?");
    $pstmt->execute(array($pgRec['template_id']));
    if($pstmt->rowCount() == 1){
        $templateRec = $pstmt->fetch(PDO::FETCH_ASSOC);
    } else {
        $pstmt = $dbConn->prepare("SELECT * FROM vfs WHERE url = '/404.php' || short_url = '/404.php'");
        $pstmt->execute();
        $pgRec = $pstmt->fetch(PDO::FETCH_ASSOC);
        $pstmt = $dbConn->prepare("SELECT * FROM templates WHERE id = ?");
        $pstmt->execute(array($pgRec['template_id']));
        $templateRec = $pstmt->fetch(PDO::FETCH_ASSOC);
    }
} else {
    $pstmt = $dbConn->prepare("SELECT * FROM vfs WHERE url = '/404.php' || short_url = '/404.php'");
    $pstmt->execute();
    $pgRec = $pstmt->fetch(PDO::FETCH_ASSOC);
    $pstmt = $dbConn->prepare("SELECT * FROM templates WHERE id = ?");
    $pstmt->execute(array($pgRec['template_id']));
    $templateRec = $pstmt->fetch(PDO::FETCH_ASSOC);
}

代码的顶部执行,从 dbo->query() 拉取而 pdo->prepare() 触发以下错误

致命错误:未捕获的错误:在 /homepages/3/d692026076/htdocs/aeallord.com/public/cms.php:28 中调用 null 上的成员函数 prepare() 堆栈跟踪:#0 {main} 抛出/homepages/3/d692026076/htdocs/aeallord.com/public/cms.php 第 28 行

我不明白为什么 pdo->prepare() 会在 pdo->query() 运行显示数据库连接已建立时触发和错误,但可以查询 pdo->prepare()导致失败。

以上代码的结果可以在 aeallord.com 看到

任何关于我的代码错误的指导,或者如果有某种方式 1and1 可以阻止 pdo->prepare() 执行,将不胜感激。

【问题讨论】:

  • 我无法编辑我的问题,但我已将 aeallord.com 上的代码更新为从 $dbh->prepare 声明 $dbConn->prepare()。这是我在多次尝试让 prepare() 正确触发后发布之前没有更改的一个位置。

标签: php mysql pdo


【解决方案1】:

Call to a member function prepare() on null 表示您尝试调用未定义的方法。

$dbh 不是 PDO 对象。 $dbConn 是你的对象。

$dbConn = DBClass::dbConnect();
// snip
$pstmt = $dbh->prepare("SELECT * FROM vfs WHERE url = :url || short_url = :url");

【讨论】:

  • 将代码更新为 $dbConn->prepare(),结果没有任何区别。那是我的错,尝试了几件事,却忘了把那个位置改回来..
  • 出现同样的错误信息。因此,为什么我想知道主机是否以某种方式阻止了 dbo->prepare() 的运行。
  • 也许在准备之前做一个var_dump($dbConn) 以确保$dbConn 仍然是我们认为的那样。错误消息是说它不是我们认为的那样。
  • 感谢您与我一起逐步完成。我一直在上传 FTP,似乎有些东西缓存在我的客户端中,并且没有正确更新服务器。当我拿走你的var_dump($dbConn) 时,我将文件上传到服务器文件管理器,现在我得到了预期的结果。非常感谢您的帮助@TimMorton..
  • 很高兴为您提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2020-10-26
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多