【发布时间】: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() 正确触发后发布之前没有更改的一个位置。