[經驗棧]SQL語句邏輯運算符"AND"、"&&"兼容性

最近打算把博客轉移到typecho平臺,選了一個風格我的比較喜歡的主題,即Akina for Typecho 主題模板,在這裏先感謝題主的開源分享,可是在使用過程當中一開始就出現「500 Database Query Error」問題。
500 Database Query Error
在typecho的index.php文件最開始位置加入如下代碼。php

define('__TYPECHO_DEBUG__',true);

再次打開網頁,查看網頁源代碼後發現以下錯誤提示:html

<pre><code><h1>SQLSTATE[HY000]: General error: 1 near &quot;&amp;&quot;: syntax error</h1>Typecho_Db_Query_Exception: SQLSTATE[HY000]: General error: 1 near &quot;&amp;&quot;: syntax error in /www/users/root/WEB/var/Typecho/Db/Adapter/Pdo.php:105
Stack trace:
#0 /www/users/root/WEB/var/Typecho/Db.php(354): Typecho_Db_Adapter_Pdo-&gt;query('SELECT typecho_...', Object(PDO), 1, 'SELECT')
#1 /www/users/root/WEB/var/Typecho/Db.php(384): Typecho_Db-&gt;query(Object(Typecho_Db_Query), 1)
#2 /www/users/root/WEB/usr/themes/Akina/index.php(39): Typecho_Db-&gt;fetchAll(Object(Typecho_Db_Query))
#3 /www/users/root/WEB/var/Widget/Archive.php(2022): require_once('/www/users/root...')
#4 /www/users/root/WEB/var/Typecho/Router.php(138): Widget_Archive-&gt;render()
#5 /www/users/root/WEB/index.php(26): Typecho_Router::dispatch()
#6 {main}</code></pre>

經過查看錯誤代碼能夠看到錯誤發生在"Akina/index.php(39): Typecho_Db->fetchAll(Object(Typecho_Db_Query))"函數,經過打印傳入參數fetchAll()能夠看到是一個查詢語句:數據庫

["where"]=>
string(176) " WHERE  ("type" = #param:0 # && "status" = #param:1# && "created" < #param:2# ) AND (typecho_contents."cid" != #param:3# ) OR ("authorId" = #param:4# && "status" = #param:5# )"

看到這裏我才發現我用的是SQLITE數據庫,在SQLITE數據庫裏是不支持"&&"作邏輯與運算符的,經過將"Akina/index.php"文件如下代碼中的"&&"改成"AND"後從新加載頁面,錯誤消失,打開頁面正常。函數

$select2 = $this->select()->where('type = ? && status = ? && created < ?', 'post','publish',time());
if($uid) $select2->orWhere('authorId = ? && status = ?',$uid,'private');

最後我對MYSQL、SQL Server、SQLite數據庫進行實驗後,只有MYSQL數據庫支持"&&",三者都能支持"AND",因此在寫SQL語句中咱們儘可能採用標準的"AND"做爲邏輯與運算符。typecho

相關文章
相關標籤/搜索