2012-07-20 3 views
0

PDO를 처음 사용하고 질문에 추가하기 전에 $ 입력을 이스케이프해야합니까? 어떻게 구현해야합니까?PDO를 처음 접한다면이 SQL을 올바르게 작성하는 방법은 무엇입니까?

$input= $_POST['time']; //2012-07-21 17:00:00 

foreach($db->query('SELECT * FROM events WHERE TIMESTAMPDIFF(HOUR , TIME, $input) < 2') as $row) { 
    echo $row['name']; 
} 
+8

당신이 잘못 사용하고 있습니다. 새로운 코드에 mysql_ * 함수를 사용하지 마십시오. 더 이상 유지 관리되지 않으며 커뮤니티에서 [지원 중단 프로세스] (http://goo.gl/KJveJ)를 시작했습니다. [** 빨간색 상자 **] (http://goo.gl/GPmFd)를 참조하십시오. 대신 [prepared statements] (http://goo.gl/vn8zQ)에 대해 알아야하고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용해야합니다. mysqli). 결정할 수없는 경우 [이 기사] (http://goo.gl/3gqF9)를 선택하면 도움이됩니다. 당신이 배우기를 원한다면, 여기 [좋은 PDO 튜토리얼] (http://goo.gl/vFWnC)입니다. –

+1

결과는'false'이며 에코와 함께 출력되지 않습니다. 데이터베이스에 연결되어 있지 않기 때문에 결과가 false입니다. 그리고 처음부터 그것을 사용하는 것은 잘못된 것입니다. : d – Esailija

답변

1

당신의 경우에는 prepared statement를 사용해야하지만 PDO :: quote()를 사용하지 않을 것입니다. mysqli 또는 PDO로 전환하는 주된 이유 중 하나입니다.

$db = new PDO('mysql:host=localhost;dbname=db', 'user','pass'); 

$query = $db->prepare('SELECT * FROM events WHERE TIMESTAMPDIFF(HOUR , TIME, :input) < 2'); 
$query->bindValue(":input", $input, PDO::PARAM_INT); 
$query->execute(); 
while($row = $query->fetch(PDO::FETCH_ASSOC)) 
{ 

} 
+0

고맙습니다. 따라서 PDO는 mysql 실제 이스케이프 문자열과 같은 이스케이프가 필요하지 않습니다. – EnexoOnoma

+0

그것은 달릴 필요가 쿼리에 문자열을 "수동으로"연결할 때마다 달라질 수 있습니다. 준비된 문장을 사용하면 그렇지 않습니다. mysql_real_escape_string에 해당하는 PDO는 PDO :: quote(), $ string = $ db-> quote ($ string)입니다. 이스케이프 외에도 따옴표를 추가하므로 문자열에만 사용해야합니다. 숫자에 대해서만 타입 캐스팅을 사용해야합니다. $ safe_int = (int) $ presumably_safe_int. –

0

나는 진실에 동의합니다.

질문에 대답하려면 mysql_real_escape_string()이 작동하려면 활성 연결이 필요합니다. 데이터베이스에 대한 연결을 열지 않았다면 연결을 명시 적으로 지정하지 않으면 마지막 연결이 해제됩니다.

관련 문제