PDO는

2015-01-16 2 views
1

은 첫 번째 질문 : 보인다 우리가 문제를 가지고있다 PDO에 mySQLi에서 코드를 마이그레이션 한 후PDO는

가 내 문제가 PDO가 추가되어

것을 요청하는 시간 독서 년 후 MySQL의 쿼리에 아포스트로피를 추가 쿼리에 아포스트로피.

$sort = $_GET['sort']; << table column name (mySQL VARCHAR only columns) 

.... 
$query = 'SELECT * FROM table WHERE xxx > 0'; 
$query .= ' ORDER BY :sort ASC ;'; 

$qry_result= $db->prepare($query); 
$qry_result->execute(array(':sort'=>$sort)); 

mysqli 버전이 순조롭게하지만 지금은 (MySQL의 로그 파일)을 조회 다음과 같습니다 :

PHP 코드를 그런 식으로가는

SELECT * FROM table where xxx > 0 ORDER BY 'SORT_VAR_VALUE' ASC; 
             ^2 problems^

그래서 테이블 정렬 순서로 정렬되지 않습니다 (mySQL 관점에서) 잘못된 것입니다.

phpinfo()는 "magic"이나 "quotes"btw에서 검색 한 결과가 없습니다.

어떤 아이디어 ??

답변

2

PDO 문의 자리 표시자는 값 전용입니다. 실제 SQL을 조회에 추가하려면 다른 f}으로 수행해야합니다.

먼저 $sort을 삭제하고 쿼리에서 백틱으로 묶어야합니다.

$query = "SELECT * FROM table WHERE xxx > 0 ORDER BY `$sort` ASC"; 

또는 당신과 같이 preg_replace로 대체 할 수 :

$sort = preg_replace('/^[a-zA-Z0-9_]/', '', $sort); 

그런 다음 쿼리 문자열을 인용 더블 수 있으며, PHP는 그것으로 $sort을 대체합니다 당신을 위해 값의

$query = 'SELECT * FROM table WHERE xxx > 0 ORDER BY `:sort` ASC'; 
$query = preg_replace('/:sort/', $sort, $query, 1); 

preg_replace의 결과를 다른 질문에 할당하면 쿼리를 다시 사용할 수 있으므로 preg_replace 메서드를 사용합니다. 원래 변수를 겹쳐 쓰는 대신 변수를 사용하십시오.

+0

수 없다 ... 그것은 mySQL에 대한 것이었다 .. 감사합니다 @BrokenBinary 및 다른 사람 –

+0

하나 더 자세하게, 정렬 필드는 대부분 varchars이지만 나는 빈약 한 숫자로 정렬해야합니다 (누군가 varchars에 숫자를 넣으려는 잘못된 결정을 내렸습니다.). 그래서 정렬 문자열은 'FIELD + 0'과 같아서 적절한 정렬을 얻습니다. 이 방법은 이와 같은 문자열로 작동합니다. '+ 기호는 무엇입니까? –

+0

'+ '기호를 허용하려면 위생 표준 정규 표현식을''/^[a-zA-Z0-9 _ +] /''('+' 끝). 내 대답에있는 다른 모든 것은'+'기호로 잘 작동해야합니다. 또는'$ sort'을 삭제 한 후에'+ 0'을 추가하면됩니다. 어느 쪽이든 작동합니다. – BrokenBinary

2

기본적으로 pdo는 값을 문자열로 바인딩합니다.

당신이 그것을 다음과 같은 방법을 수행 할 수 있습니다, 당신은 열이 실제로 유효한 이름인지 확인하고 쿼리에 추가 할 것입니다이 문제를 해결하려면, PDO와

function validName($string){ 
    return !preg_match("/[^a-zA-Z0-9\$_\.]/i", $string); 
} 

if(validName($sort)){ 
    $db->prepare("SELECT * FROM table where xxx > 0 ORDER BY $sort ASC"); 
} 
+1

where 문에서 다른 변수를 바인딩 할 수 없기 때문에이 방법은 작동하지 않습니다. – Guillermo

+0

100 % 잘못되었습니다. 당신은 어디서나 바인딩 할 수 있습니다 –

+0

하지만 확인할 수 있습니다 : 정렬은 항상 varchar 열 –