2014-09-28 1 views
0

저는 PHP를 처음 접했고 1 년 전만해도 MySQL을 만난 클래스가 있습니다.PHP 변수와 비교되는 MySQL DB 쿼리

db 테이블에 값을 쿼리하기 위해 기존 코드에 체크를 추가하려고하는데, 그 값이 = 1이면 코드의 변수를 변경하십시오. 충분히 간단하지만 작동하지 않습니다. 쿼리가 Sequel Pro에서 예상대로 작동하더라도 쿼리 결과가 0입니다.

기존 쿼리 이후에 필자가 작성하고 실행하는 함수를 완전히 이해하지 못한다고하더라도 필자는 필자의 구문을 모델링하고있다. 왜냐하면 필자 자신이 더 쉽게 만들기 위해 새 db 연결을 만들고 싶지 않기 때문이다. 나는 그 문제의 발췌 문장을 줄 것이다.

내 질문 : 왜 데이터베이스에서 직접 정상적으로 작동하면 결과를 반환하지 않습니까? 쿼리는 Integer 형식의 결과 2 개를 반환해야하는데, 다른 정수 $ friend_uid와 비교하고 싶습니다. 여기

$dbObj = new sdb("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USERNAME, DB_PASSWORD); 
$dbObj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$newStatus = 'REQUEST_PENDING'; 
$botquery = "SELECT `KAP_USER_MAIN.UID` FROM `KAP_USER_MAIN` WHERE `KAP_USER_MAIN.IS_BOT` = 1"; 

$botstatement = $dbObj->prepare($botquery, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
$botstatement->execute(); 
$posts[]= "sql error " . mysql_error(); 
if(!$botstatement){ 
    $posts[] = "failed bot query: " . mysql_error();       
} 
$num_rows = mysql_num_rows($botstatement); 
if ($num_rows == false) { 
    $num_rows = 0; 
} 
$posts[] = "$num_rows rows"; 
while($row = mysql_fetch_array($botstatement)) { 
if($row[0]['UID'] == $friend_uid){ 
    $newStatus = 'FRIENDS'; 
} 
}       
$statement->execute(array(':uid'=>$uid,':friend_uid'=>$friend_uid,':status'=>$newStatus)); 

내가 모델링하고 잘 작동 기존 코드에서 쿼리의 예입니다 후 :

$query = "SELECT kits.TOTAL_UNIT,kum.ENERGY,kum.NAME,kum.LEVEL FROM KAP_USER_MAIN kum,KNP_INVENTORY_TRANSACTION_SUMMARY kits WHERE kits.UID = :uid AND kits.INV_ID = '10004' and kum.UID = :uid"; 
     $statement = $dbObj->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
     $statement->execute(array(':uid'=>$uid)); 
     $res = $statement->fetchAll(PDO::FETCH_ASSOC); 
     $sender_name = $res[0]['NAME']; 
+0

하나의 입력란 만 선택하면 어떻게 되나요? 'SELECT KAP_USER_MAIN.UID FROM [...]'. '$ statement-> execute ([...])' –

+0

쿼리의 요구 사항과 일치하는 두 개의 결과가 있는데 모두 반환해야합니다. 문제는 반환되는 것이 아닙니다. 명령문은 실행 준비 라인에서 식별됩니다. 당신이 그것을 고치는 법을 안다면 나는 완전히 새로운 것입니다. – user1814946

+1

** PDO 및 mysql 인터페이스 호출을 ** 혼합하지 마십시오. 즉, 함수 mysql_num_rows와 mysql_error에 대한 호출은 제거되어야하고, 상응하는 PDO 기능으로 대체되어야한다. – spencer7593

답변

1
PDO와 MySQL 기능을 함께 사용하지 마십시오

코드를 자세히 살펴보면, PDO와 MySQL 함수를 혼합 한 것처럼 보입니다.

그건 이 아니고이 유효합니다. 두 개의 개별 인터페이스 라이브러리에 전화를 혼용하지 마십시오.

mysql_fetch_array 기능을 사용하여 PDO 문에서 가져올 수 없습니다. 적절한 PDO 가져 오기 기능/메소드를 사용하십시오.

PHP에는 3 개의 별도의 MySQL 인터페이스 라이브러리가 있습니다.

mysql 인터페이스의 이전 기능이 이제는 mysql_으로 시작합니다.

개선 된 mysqli 인터페이스가 있습니다. 프로 시저 스타일 함수는 모두 mysqli_으로 시작합니다.

세 번째로 더 많은 데이터베이스 독립적 인 PDO 인터페이스가 있습니다.

믹싱 호출이 작동하지 않으므로이 세 개의 별도 인터페이스 라이브러리의 호출을 혼합하지 마십시오.

PDO와의 연결을 준비 중이고 PDO로 진술을 준비하는 것처럼 보이지만 ... msyql_error, mysql_num_rowsmysql_fetch_array 함수를 호출하고 있습니다. mysql_ 함수 호출을 적절한 PDO 함수로 대체하십시오.


열 이름의 도트 문자?

열 이름에 점 문자를 포함하는 것은 매우 이상합니다. (그렇게하는 것은 무의미한 일이 아니지만 그런 것이 우리 가게에서 날아 가지 않을 것입니다.)

SELECT `KAP_USER_MAIN.UID` FROM `KAP_USER_MAIN` WHERE `KAP_USER_MAIN.IS_BOT` = 1 
        ^           ^

하지만 열 이름이 실제로 UIDIS_BOT, 당신이 의도 한 그였다 있음을 의심 해요 :

SELECT `KAP_USER_MAIN`.`UID` FROM `KAP_USER_MAIN` WHERE `KAP_USER_MAIN`.`IS_BOT` = 1 
        ^^           ^^ 

각 식별자 (열 이름과 테이블 이름)이 될 수 있습니다 따로 탈출했다. 테이블 이름과 열 이름 사이의 점 문자는 이 아니며이 이스케이프되어야합니다. 이는 식별자의 일부가 아닌 SQL 텍스트의 일부이기 때문입니다. 일부 점 문자로 원래 쿼리 (에 쿼리 동등한를 들어,

SELECT m.UID FROM `KAP_USER_MAIN` m WHERE m.IS_BOT` = 1 

을 또는 :

우리는 일반적으로 너무 일반적인 쿼리는 다음과 같이 것, 우리의 질의에 짧은 테이블 별칭을 사용) 열 이름의이 같은 :.

SELECT m.`KAP_USER_MAIN.UID` FROM `KAP_USER_MAIN` m WHERE m.`KAP_USER_MAIN.IS_BOT` = 1 

(즉, 열 이름에 점 문자를 포함 할 수 무효 아니지만, 우리가 자주 볼 수없는 특이한 패턴, 하나 내 생각 그 패턴이 더 많은 것을 유도하기 때문입니다. 잠재적 인 문제를 해결하기 위해 의도 된 문제보다)

쿼리가 코드에서 작동하는 경우 해당 점 문자는 열 이름의 일부 여야합니다.

+0

고맙습니다. 필자가 점 표기법을 사용하는 열을 언급하고 있으며 드물기는하지만 제거해도 괜찮습니다. $ botquery = "m.UID FROM'KAP_USER_MAIN' m으로 선택 m.IS_BOT = 1"; 이제 실행 라인 다음에 정의되지 않은 mysql_error()를 얻는다. – user1814946

+0

코드의 실제 문제는 ** PDO ** 인터페이스 함수와 ** mysql _ ** 인터페이스 함수에 대한 호출을 혼합하는 것입니다. ** mysql_num_rows' ** 함수에 대한 호출은 제거되어야하고, 상응하는 PDO 기능으로 대체되어야한다. – spencer7593

+0

점 표기법과 mysql_error() 호출을 제거했습니다. 쿼리에 대한 결과가 아직 나오지 않습니다. – user1814946