2014-10-08 4 views
0

이 코드에서 오류가 발생했습니다. MySQLi에서 매개 변수를 바인딩해야하는시기는 언제입니까?

//Prepare insert statement. 
    if($InsertEventQuery = $mysqli->prepare("INSERT into events(eventname, eventdesc, eventmonth, eventdate, eventyear, eventstart, eventend) VALUES ('$EventName','$EventDesc','$EventMonth','$EventDate','$EventYear','$EventStart','$EventEnd')")) 
    { 
     //Bind parameters of insert statement. 
     $InsertEventQuery->bind_param('ssiiiii', $EventName, $EventDesc, $EventMonth, $EventDate, $EventYear, $EventStart, $EventEnd); 

오류입니다 :

"경고 : mysqli_stmt :: bind_param() : 변수의 수에 준비된 성명에서 매개 변수의 수와 일치하지 않습니다 [...]"

PHP Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement

"당신은이 경우에 매개 변수를 바인딩 할 필요가 없습니다 : 오류가 잘못 발견 될 것으로 보인다 때문에 나는 그것으로 보았다. 자리 표시자는 INSERT 문의 값이나 WHERE 절에 사용됩니다. 문안의 열 이름과 같은 식별자에는 자리 표시자를 사용할 수 없습니다. "

이렇게 혼란 스러우면 보안에 대한 궁금증이 생깁니다. 매개 변수를 바인딩 할 필요가있을 때 언제 필요합니까? 자리 표시자를 사용할 수 있습니다.

감사합니다!

답변

0

바인딩 매개 변수는 SQL 주입을 방지 할 어떠한 INSERT 문에서 좋은 아이디어이며, 또한 당신의 문자열을 무료로 소독합니다.

을 나는 보통이 작업을 진행 다음과 같이 준비 문에 물음표 사용 :


    //Prepare insert statement. 
     if ($InsertEventQuery = $mysqli->prepare("INSERT into events(eventname, eventdesc, eventmonth, eventdate, eventyear, eventstart, eventend) VALUES (?, ?, ?, ?, ?, ?, ?)")) 
     { 
      //Bind parameters of insert statement. 
      $InsertEventQuery->bind_param('ssiiiii', $EventName, $EventDesc, $EventMonth, $EventDate, $EventYear, $EventStart, $EventEnd); 
+0

음, 좋아. 이제 prepare() 문과 bind_param() 문에 변수 이름을 넣는 것이 불필요하지만 왜 물음표가 필요한지 이해하지 못합니다. –

+0

실제로는 doc에서 가져온 것입니다. _이 매개 변수는 적절한 위치에 물음표 (?) 문자를 삽입하여 SQL 문에 하나 이상의 매개 변수 마커를 포함 할 수 있습니다 ._ [http://php.net/manual/en/mysqli .prepare.php] – Yoric

+0

글쎄, 나는 그것을 이해하지 못했지만 지금은 효과가있다. 고마워요! –