2013-01-04 5 views
15

안녕 모두 내 사이트에서 Prepared Statements를 사용해야합니다. 사용 해봤습니다.CodeIgniter에서 Prepared Statements를 사용하는 방법

$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key"; 
$query = $this->db->query( 
    $sql, 
    array(':id' => $uid ,':key' => $activation_key) 
); 

하지만 작동하지 않습니다. 내가 :id:key?으로 바꾼다.

답변

28

CodeIgniter는 Prepared Statements를 지원하지 않습니다. 당신이 CI의 데이터베이스 클래스의 소스 코드를 보면, 당신은 그들이 단순히 전달 된 배열에서 데이터와 물음표를 대체하여 바인딩을 해결하는 것을 볼 수 있습니다 :

그들은 단지 쿼리 바인딩 지원 익명의 자리 표시 자. http://ellislab.com/codeigniter/user-guide/database/queries.html

쿼리 바인딩

바인딩 시스템이 당신을 위해 함께 쿼리를 넣을 수 있도록함으로써 쿼리 구문을 단순화 할 수 있습니다 참조하십시오. 다음 예제를 고려하십시오.

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick')); 

쿼리의 물음표는 쿼리 함수의 두 번째 매개 변수에있는 배열의 값으로 자동으로 대체됩니다. CI는 준비된 명령문을 지원하지 않는 경우에도

http://ellislab.com/forums/viewthread/105112/#528915, 그것은 쿼리 바인딩을 지원합니다. Prepared 문을 사용하면 어떤 종류의 prepare() 함수를 호출 한 다음 execute() 함수를 호출해야합니다. 쿼리 바인딩을 사용하면 함수 하나만 호출하면됩니다. 기본적으로 동일한 작업을 수행합니다. 이 때문에 준비된 문보다 쿼리 바인딩이 더 좋습니다. :foo-?을 변경하는 (!) 참고에

는 단지라는 이름의 바인딩 (이 CI 분명히 중 하나를 지원하지 않음)에 이름에서 변화하고있다. 그 중 하나를 사용했기 때문에 또는 진술을 준비하고 있다는 것을 의미하지는 않습니다.

+0

출력 난 당신이 도움이 필요한 경우 기본 쿼리를 볼 수있다. 여기를보십시오 : http://stackoverflow.com/questions/38607368/how-to-implement-in-to-prepare-statement?noredirect=1#comment64603092_38607368 –

3

비슷한 문제에 직면했을 때 나는이 질문에 마주 쳤다. CI가 준비된 문을 지원하지 않는다는 대답은 정확합니다. 그러나 은 준비된 명령문을 사용할 수 없다는 것을 의미하는 것은 아닙니다.! 내 연결 클래스로 PDO를 사용하고 있지만, 다음과 같은 코드가 작동합니다 다음 예에서

:

$q = $this->db->conn_id->prepare('SELECT * FROM tbl_user WHERE uid=? and activation_key=?'); 
$q->execute(array($param1,$param2)); 
print_r($q->fetchAll()); 

conn_id 당신이 당신의 준비된 문을 실행할 수있는에 대해 PDO 개체입니다.

그러나 이것이 허용하지 않는 것은 네이티브 CI 함수가 허용하는 쿼리 문자열을 얻는 것입니다. 이를 위해서는 Get Last Executed Query in PHP PDO과 같은 것이 필요할 것입니다.

그러나 더 이상 그렇다고해서 PDO 준비에서 사용할 수있는 문 작성을 위해 쿼리 작성기를 사용하는 것을 중단하지는 않습니다.예를 들어 -

$db->where('uid = ?',null,false); 
$db->where('activation_key = ?',null,false); 
$q = $this->db->conn_id->prepare($db->get_compiled_select('tbl_user')); 

는 쿼리를 작성겠습니까 당신이 $db->get_compiled_select('tbl_user');

+0

CI + safe prepared statements – vivoconunxino

관련 문제