2013-12-16 172 views
-2

我在學習如何將我的數據庫查詢轉換爲PDO。有人告訴我,將我的查詢一個如下...這個PDO查詢有什麼問題?

$stmt = $db->prepare("SELECT P.URL, P.Title, P.Subtitle, P.MetaTitle, P.MetaDesc, P.KW, P.Site, P.Live, PB.Common, PB.First, PB.Middle, PB.Last, PB.Prefix, PB.Suffix, PB.Alpha, PB.Born, PB.Died, PB.Birth_Place, PB.Death_Place, PB.Nationality, PC.URL, PC.Class, Brf.URL, Brf.Site, Brf.Brief, ART.Article PXA 
FROM people P 
LEFT JOIN people_1_bio PB ON PB.URL = P.URL 
LEFT JOIN people_1_class PC ON PC.URL = P.URL 
LEFT JOIN people_briefs Brf ON Brf.URL = P.URL 
LEFT JOIN people_articles_px ART ON ART.URL = P.URL 
WHERE P.Site = 'PX' AND Brf.Site = 'PX' AND PB.Alpha LIKE ? AND Brf.Brief !='' AND PC.URL = P.URL AND P.Live = 1 
GROUP BY P.URL ORDER BY P.N"); 
$stmt->execute(array($MyURL.'%')); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

它更多的用戶比大多數的我在教程看到的例子友好的 - 但它不工作。它拋出兩個錯誤消息:

說明:未定義變量:分貝在/用戶/ ...上線118

致命錯誤:調用一個成員函數準備()非對象上在/用戶/ ......上線118

它們對應於這條線......

$stmt = $db->prepare("ELECT P.URL, P.Title, P.Subtitle, P.MetaTitle, P.MetaDesc, P.KW, P.Site, P.Live, 

我發現問幾個StackOverflow的討論同樣的問題,但我不明白的答案。一個討論說你必須使用這個例子創建一個「$ db對象」:

$db = new mysqli("localhost", "username", "password", "database") 

但是,我正在使用MySQL。我嘗試將mysqli更改爲mysql,但它不起作用。

另一個討論說我需要粘貼我上面的查詢如下:

function confirmIPAddress($value) { 
    global $db 

要使其工作,我一定要在末尾添加一個分號,然後把一個右括號我的查詢後。但它不起作用。我認爲PDO應該是用戶友好的,但它甚至不會與舊的方法相比。

這是我原來的查詢:

$res = mysql_query ("SELECT P.URL, P.Title, P.Subtitle, P.MetaTitle, P.MetaDesc, P.KW, P.Site, P.Live, PB.Common, PB.First, PB.Middle, PB.Last, PB.Prefix, PB.Suffix, PB.Alpha, PB.Born, PB.Died, PB.Birth_Place, PB.Death_Place, PB.Nationality, PC.URL, group_concat(PC.Class), Brf.URL, Brf.Site, Brf.Brief, ART.Article PXA 
FROM people P 
LEFT JOIN people_1_bio PB ON PB.URL = P.URL 
LEFT JOIN people_1_class PC ON PC.URL = P.URL 
LEFT JOIN people_briefs Brf ON Brf.URL = P.URL 
LEFT JOIN people_articles_px ART ON ART.URL = P.URL 
WHERE P.Site = 'PX' AND Brf.Site = 'PX' AND PB.Alpha LIKE '$MyURL%' AND Brf.Brief !='' AND PC.URL = P.URL AND P.Live = 1 
GROUP BY P.URL ORDER BY P.N") or die (mysql_error()); 
+0

'$ stmt = $ db-> prepare(「ELEC」是否僅在問題中存在拼寫錯誤,還是代碼中存在錯誤?) – hammus

+2

所以請發佈代碼,因爲您現在正在圍繞查詢。錯誤消息意味着'$ db'不在範圍內,如果這發生在函數內部,那麼您必須將'$ db'作爲參數傳遞給函數(首選)或全局訪問它(不是首選) –

+1

需要將$ db聲明爲新的PDO – Jompper

回答

1

如果你已經有一個現成的數據庫連接這將是最好將它傳遞給你的函數,即:

function confirmIPAddress(PDO $db, $value) 
{ 
    $stmt = $db->prepare('..'); 
    // ... 

當叫:

confirmIPAddress($db, $value);