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

... 내 쿼리 중 하나를 변환 그것은 내가 튜토리얼에서 볼 수있는 대부분의 예제보다 더 친절한 더 사용하라고 -하지만 그것은 작동하지 않습니다.

주의 : 정의되지 않은 변수 : 그것은 두 오류 메시지가 발생에서 DB/사용자/... 라인 118

치명적인 오류 :의 비 객체() 제조/사용자 멤버 함수를 호출/...

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

라인 (118)

그들은이 라인에 해당 ...

에 나는 몇 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->에 누락 된 S가 있습니까? ("ELEC"질문에만 오타가 있거나 코드에도 포함되어 있습니까?) – hammus

+2

그래서 현재 검색어를 둘러싸고있는 코드를 게시하십시오. 이 에러 메시지는'$ db'가 범위 내에 있지 않다는 것을 의미합니다. 함수 안에'$ db'를 매개 변수로 전달하거나 (선호하지 않음) 전역 적으로 액세스해야합니다 (선호하지 않음) –

+1

You 새 PDO로 $ db를 선언해야합니다. – Jompper

답변

1

당신은 이미 함수로 전달하는 가장 좋은 것입니다 기존 데이터베이스 연결, 즉이 경우라고

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

:

confirmIPAddress($db, $value); 
관련 문제