2010-02-20 7 views
1

[상태 : 학습자]매개 변수화 된 쿼리를 수행하는 방법

매개 변수가있는 쿼리를 구현하려고하는데 문제가 있습니다. 조나단 샘슨 (Jonathan Sampson)은 최근 이것이 어떻게 수행 될 수 있는지 암시했지만 (# 2286115), 나는 그의 제안을 올바르게 따르지 않을 것입니다. 여기 내 스크립트

$cGrade = "grade" ; 

include_once ("db_login.php") ; 

$sql = "SELECT last_name AS last_name 
       , first_name AS first_name 
       , grade  AS gr 
       , ethnic  AS eth 
       , sex   AS sex 
       , student_id AS id_num 
       , reason  AS reason 
       , mon_init AS since 
      FROM t_tims0809 
     WHERE tag <> '' AND 
       tag IS NOT NULL AND 
       schcode = {$schcode} 
     ORDER 
      BY ('%s') " ; 

$qResult = mysql_query (sprintf ($sql, $cGrade) or ("Error: " . mysql_error())) ; 

쿼리 구문에 의해 순서대로 grade와 함께 잘 작동합니다.

감사합니다. MySQLi prepared statements 클래스 밖으로

+1

당신은이를 사용하여주의 할을 "매개 변수"에 의한 순서는 사용자로부터옵니다. 이는 매개 변수에 대한 안전한 따옴표를 사용하여 실제 매개 변수화 된 쿼리가 아닌 문자열 대체를 수행하기 때문에 sQL 주입이 필요합니다. @ Xorlev의 제안을 사용하고 준비된 진술을 사용하는 것이 훨씬 낫습니다. – tvanfosson

답변

7

확인 : PHP 매뉴얼에서

$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)"; 
$stmt = $mysqli->prepare($query); 

$stmt->bind_param("sss", $val1, $val2, $val3); 

$val1 = 'Stuttgart'; 
$val2 = 'DEU'; 
$val3 = 'Baden-Wuerttemberg'; 

/* Execute the statement */ 
$stmt->execute(); 

.

필자는 매개 변수화 된 쿼리를 수행하는 데있어 탁월한 방법이라고 생각합니다. 특히 벌크 삽입/선택 중에 가능하면 준비된 문으로 전환했습니다.

+0

고맙습니다, Xorlev. 진실을 말하면 OOP에 대해서는 아무 것도 몰라요. "->"기호를 볼 때, 나는 다른 길을 실행합니다. 나는 이것을 시험해 볼 것입니다. – dave

+0

@Dave Object Oriented Programming은 조금 위협적이지만 조금씩 가져 가면 좋아질 것입니다. :) – Sampson

0

Xorlev의 답변이 완전히 정확합니다. 구문에 대한 다른 옵션도 있습니다. 당신은 이름 쿼리 내에서 바인드 변수를 지정할 수 있습니다

$stmt = $mysqli->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 

또는 당신은 속기 일을하고 bindParam()에 대한 호출을 생략하려는 경우 : 특히,

$stmt = $mysqli->prepare('INSERT INTO tbl VALUES(?)'); 
$stmt->execute($stmt, array("some input")); 
$stmt->execute($stmt, array("some other input")); 
$stmt->execute($stmt, array("some more input")); 
관련 문제