这个PDO查询有什么问题?

时间:2013-12-16 02:25:43

标签: php 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);

它比我在教程中看到的大多数示例更加用户友好 - 但它不起作用。它会抛出两条错误消息:

注意:未定义的变量:db在/ Users / ...第118行

致命错误:在第118行的/ Users / ...中的非对象上调用成员函数prepare()

它们对应于这一行......

$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());

1 个答案:

答案 0 :(得分:1)

如果您已有现有的数据库连接,最好将其传递给您的函数,即:

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

致电时:

confirmIPAddress($db, $value);