2013-04-14 2 views
-1

준비, 나는 SQL 쿼리는 다음과 같이보고 있어요 바인딩 된 매개 변수를 사용합니다. 내가 바인딩 매개 변수를 사용하여 안전 하나와 일치하는 내 현재 쿼리를 수정하는 방법을 이해하지 못하는내 PHP 문서에서 SQL 쿼리

$stmt = $db->prepare('update people set name = ? where id = ?'); 
$stmt->bind_param('si',$name,$id); 
$stmt->execute(); 

: bobby-tables.com 보면서 나는이 예제 쿼리를 참조하십시오. 어떤 도움을 주셔서 감사합니다.

답변

1

$mysqli = new mysqli("localhost", "my_user", "my_password", "db"); 

if(isset($_GET['id'])) 
{ 
    $id = $_GET['id']; 
    $q = "SELECT some_field FROM `objekt_t` WHERE `id`= ?"; 

    if ($stmt = $mysqli->prepare($q)) {  
     $stmt->bind_param("i", $id); 
     $stmt->execute(); 
     $stmt->bind_result($result); 
     $stmt->fetch(); 
    } 
} 

지금 $ 변수에 포함 된 결과를 그냥 같은 방법으로 귀하의 쿼리의 resuts.

+0

내 쿼리 결과가'$ stmt' 또는'$ result'에 있습니까? –

+0

방금이 발언을 게시했습니다. $ result 변수는 스크립트 실행 후 쿼리의 리셋을 포함합니다. – zavg

+0

'var_dump ($ result);를 시도하면 NULL이됩니다. 왜 이런거야? –

1

준비된 문은 원시 데이터를 쿼리에 전송하므로 SQL 주입이 불가능합니다. real_escape_String 또는 기타 형식 지정 기능은 사용자를 대신하여 탈출 할 필요가 없습니다.

예 : 데이터가 $ _POST [같은 쿼리가 분사의 형태를 포함하므로 경우에도 원료로 전송되고 있기 때문에 기본적으로 쿼리에 직접 내 $ _POST 데이터를 결합하고

$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE Username=?"); 
$statement->bind_param('s',$_POST['Username']); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 

'사용자 이름']; 쿼리가 정상적으로 실행됩니다. 더 읽기의로 절차 및 OOP 스타일의 측면에서


, 그것은 아래로 취향에, 난 personlly 다른 옵션을 통해 OOP 스타일을 선호한다.

$ID= 5; 
$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE ID=?"); 
$statement->bind_param('i',$ID); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 

또는 직접 문 내에서 정확한 값으로 작업 할 수 있습니다 :

번호로 작업

$db = new mysqli ("host","user","password","database"); 
$statement = $db->prepare("SELECT test FROM test WHERE ID='5'"); 
$statement->execute(); 
$statement->bind_result($resultCol); 
$statement->fetch(); 
$statement->close(); 
+0

어떻게 쿼리의 결과를 사용할 수 있나요? 'var_dump ($ resultCol); 시도 중 날 null을 제공합니다. 쿼리의 결과를 사용/호출 할 수있는 방법을 이해하지 못합니다. –

+0

필자가 수정 한 내용으로'prepare' 내부의 쿼리를 수정하여 데이터베이스에서 유효한 결과를 반환해야합니다. bind_result는 사용 된 컬럼에 변수를 바인드 할 것이므로 쿼리로 4 컬럼을 선택하면 4 개의 변수를 할당해야합니다 –

+0

예를 들어 전체'prepare' 라인을'$ db-> prepare ("SELECT * FROM objekt_t WHERE id =?")'다음 행을'bind_param ('s', '5');', 내 테이블의 유일한 열로 선택할 수있는 열이 하나 밖에 없습니다. 'id = '5''. 아직도 var_dump ($ resultCol);을 시도 할 때 이것은 아무 것도주지 못합니다. 나는 명백한 무엇인가 놓치고있는 것처럼 느낀다. –

0

당신은 이런 식으로 작업을 수행 할 수 있습니다

$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?'); 
$stmt->bind_param('i', $id); 
$stmt->execute(); 

$result = $stmt->get_result(); 

while ($row = $result->fetch_assoc()) { 
    // $row is an associative array 
} 
+0

행'/ $ row는 연관 배열입니다'를 var_dump ($ row);로 변경하면 실행될 때 빈 문서가 생깁니다. 이유가 무엇입니까? –

+0

get_result 메소드에는 MySQL 기본 드라이버 (mysqlnd)가 필요합니다. 당신은 그것을 설치하지 않았을 수 있습니다. – jithujose