문제

지난 며칠 동안 사용한 몇 가지 질문을 보았습니다. mysqli 그러나 답이 인식하지 못하는 것처럼 보이는 곳 $stmt->execute() 그리고 $db->query().

내가 이해할 수 있듯이 결과에 액세스하기위한 두 가지 모델이 있습니다. mysqli.

이것은 원시 SQL을 사용하고 프로그래머가 SQL 주입 공격을 방지하기 위해 입력을 피하도록 요구하지만 프로그래머가 포함 된 연관 배열 (또는 일반 배열)을 검색 할 수 있도록합니다. column => value 매핑 :

$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
     # do something with $row['fieldname'];
}  

또는이를 수행 할 수있어 매개 변수와 결과를 잘 바인딩 할 수 있지만 (AFAIK) 간단한 배열 결과를 줄 수는 없습니다.

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
     # do something with $output_col1 and $output_col2
}

내 질문은 - 어떤 방법이 있습니까? mysqli 첫 번째 패턴으로 간단한 배열 출력을 표시하지만 두 번째 패턴에 따라 여전히 안전하게 바인딩 된 입력 매개 변수를 사용하는 동안?

어쨌든이 작업을 수행 할 수 없습니다 (사용하는 것 외에는 PDO 대신에!).

도움이 되었습니까?

해결책

PHP 매뉴얼 의이 페이지의 주석에 이러한 종류의 일을 수행하는 기능의 여러 구현이 있습니다. mysqli_stmt :: fetch

다른 팁

알 니 타크,

AFAIK, 전체 배열을 가져온 결과에 자동으로 바인딩 할 수 없습니다. 안타깝게도. 그러나 배열 동작을 찾고 있다면 (아마도 결과를 전달하기가 더 쉬울 것입니다) 이것을 시도 할 수 있습니다.

<?php
 $dbh = new mysqli( ... );
 $arr = array();
 if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
 {
  $stmt->execute();
  $stmt->bind_result( $arr['id'], $arr['email'] );

  while( $stmt->fetch() )
   DoSomething( $arr );
 }
?>

이것은 위에서 요청한 행동을 제공합니다. 그러나 배열 필드를 배열의 연관 indeces에 동적으로 바인딩하지는 않습니다. 즉, ID가 $ ARR [ 'ID'] 등에 바인딩되어야합니다.

시나리오에서 연관 적 Indeces에 대한 동적 바인딩이 실제로 필요하다면 항상 선택한 필드의 쿼리를 먼저 구문 분석 한 다음 Assoc Array Indeces를 설정 한 다음 쿼리를 수행하는 간단한 클래스를 작성할 수 있습니다.

나는 아니오라고 말할 것이다. 내가 함께 일하지 않았다고 생각했습니다 mysqli 또는 준비된 진술은 톤, 두 번째 예제의 각 단계가 개별적이고 필요하다고 생각합니다. 내가 당신에게 줄 수있는 유일한 위안은 첫 번째 예제가 두 번째 예에서 안전하고 진정으로 무시할 수있는 SQL 탈출에 대해 광택이 있다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top