2013-02-27 48 views
1

我正在使用pdo和memcache的「智能」緩存系統。但是,我被困在這個錯誤。你能幫我嗎?使用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:17

第1行的':LIMIT 1'附近使用正確的語法^發生了什麼那?

回答

1

看起來像$db->prepare()返回一個錯誤,所以你的$stmt變量不是一個真正的PDOStatement對象。使用$db->errorInfo()來查看發生了什麼問題。如果您設置了適當的屬性,您也可以將其放入try-catch塊(請參閱Errors and error handling)。

要看到,如果你的連接正常,您還可以使用的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(); 
} 
+0

我剛剛發現我不見了** $ DB->的setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION ); **。我現在有一個更準確的錯誤信息。我現在試着去解決它。謝謝! – 2013-02-27 17:57:37

+0

現在說我有一個mysql語法錯誤。你能發現它嗎?我不能。我編輯了我的原始帖子。 – 2013-02-27 18:03:42

+0

發生此錯誤是因爲您在參數名稱中沒有關閉':'。你的查詢變成這樣:'SELECT * FROM \'session \'WHERE \'session \'=:session'。別忘了引用表格和列名 – Hast 2013-02-27 18:24:15