2013-12-16 174 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);