1

我正在开发一个使用 pdo 和 memcache 的“智能”缓存系统。但是,我被这个错误困住了。你能帮我吗?

我的代码:

$session = "a121fd4ztr6";
cache_query("SELECT * FROM `session` WHERE `session` = :session: LIMIT 1;", array(':session:' => $session));

// CACHE QUERY
function cache_query($sql, $params) {
    global $db;
    global $memcache;

    $name = 'querycache-'.md5(serialize(array($sql, $params)));
    $result = $memcache->get($name);

    if (!$result) {
        if(!($db)){
            require("db.php");
        }

        $stmt = $db->prepare($sql);
        $exec = $stmt->execute($params);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        $memcache->add($name, $result);
    }

    return $result;
}

db.php 建立到 PDO 的连接。Memcache 连接已经建立。我总是收到以下错误:

编辑:添加错误模式属性后,我现在得到一个更详细的错误:

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /chroot/home/html/session.php:170 中的 ': LIMIT 1' at line 1' 附近使用正确的语法

^这是怎么回事?

4

1 回答 1

1

看起来$db->prepare()返回一个错误,所以你的$stmt变量不是一个真实的PDOStatement对象。使用$db->errorInfo()来查看发生了什么问题。如果您设置了适当的属性,您也可以将它放到 try-catch 块中(请参阅错误和错误处理)。

要查看您的连接是否正常,您也可以使用 try-catch:

try {
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
于 2013-02-27T17:49:26.390 回答