2013-07-18 2 views
1

여기mysqli prepared statements를 배우려고 시도합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

require_once("../database/config.php"); 

     $pageSlug = "home"; 

     $db = new mysqli(_DB_HOST, _DB_USER, _DB_PASSWORD, _DB_NAME); 

     if ($db->connect_errno) { 
      echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error; 
      exit(); 
     } 

     if (!$selectQuery = $db->prepare("SELECT * FROM ?.Pages WHERE slug='?'")) { 
      echo "Failed to prepare statement: (" . $db->errno . ") " . $db->error; 
      exit(); 
     } 

     if (!$selectQuery->bind_param("ss", _DB_NAME, $pageSlug)) { 
      echo "Binding parameters failed: (" . $selectQuery->errno . ") " . $selectQuery->error; 
      exit(); 
     } 

     if (!$selectQuery->execute()) { 
      echo "Exexute failed: (" . $selectQuery->errno . ") " . $selectQuery->error; 
      exit(); 
     } 

     echo "<pre>I GOT HERE!</pre>"; 
     exit(); 

../database/config.php 그냥 내가 위에서 ("_DB_NAME"등을 참조하는 글로벌 변수를 포함 ... 내 코드의 여기 ...

Failed to prepare statement: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?.Pages WHERE slug='?'' at line 1 

내가지고있어 오류입니다 그리고).

나는 아직도이 준비된 문장 주위에 머리를 감싸고 있고 내가 잘못하고있는 것을 정말로 모른다고 생각한다. 사전에

감사합니다!

+0

[PHP \ MYSQL 준비된 문] (http://stackoverflow.com/questions/16057356/php-mysql-prepared-statements) 가능한 중복 " – BlitZ

답변

3

준비된 문은 매개 변수의 값을 제공하기 전에 구문 확인을 위해 DBMS에 제출되므로 식별자 (스키마 이름, 테이블 이름, 열 이름 등)를 제공하는 매개 변수를 사용할 수 없습니다.

http://php.net/mysqli-prepare

마커는

는 SQL 문에서 특정 장소에서 법적이다. 예제의 경우 WHERE 절의 열과의 비교에서 비교 값을 지정하기 위해 INSERT 문의 VALUES() 목록에 허용됩니다 (행에 대해 열 값 지정). 그러나 SELECT 문에서 반환 할 열의 이름을 지정하는 선택 목록에 식별자 (예 : 테이블 또는 열 이름)에 사용할 수있는 문자가 이 아니거나 = equal과 같은 이진 연산자의 피연산자를 모두 지정하는 경우 입니다. 표지판. 매개 변수 유형을 결정할 수 없기 때문에 이 될 수 있으므로 후자의 제한이 필요합니다. 마커와 NULL을 (를) 비교할 수 있습니까? 역시 NULL입니다. 일반적으로, 매개 변수가

http://dev.mysql.com/doc/refman/5.0/en/prepare.html

매개 변수 표시 문자는 데이터 값을 사용할 수있는 경우에만 데이터 조작 언어에 대한 법률 (DML) 문, 그리고 데이터 정의 언어 (DDL) 문은 은 SQL 키워드, 식별자 등을 나타내지 않습니다.


그래도, 당신은 동적 SQL을 사용할 수 있습니다. 예 :

$table = 'Example'; // Should be safe, avoid user input. 
$sql = "SELECT * FROM `{$table}` WHERE `id` = ?"; 
$stmt = $db->prepare($sql); 
// ... 

UPD : 나는 당신이 따옴표 문자열 매개 변수 마커 주위 '을 사용하고 있는지, 나타났습니다

. dbms는 그 자체로 그들에 관심이 있기 때문에 피해야합니다. slug='?'slug = ?이어야합니다.

신중하게 읽으십시오 : http://php.net/mysqli-prepare.

+0

" "동적 SQL"에 대해 자세히 설명해 주시겠습니까? –

관련 문제