이 질문에 대한 새로운 활동이 있었던 지 오래되었다는 것을 알고 있습니다. 그러나 다른 포스터가 언급 get_result()
했듯이 - 이제는 MySQL 네이티브 드라이버 (mysqlnd)를 설치하여 PHP에서만 사용할 수 있으며 경우에 따라 mysqlnd를 설치하는 것이 가능하지 않거나 바람직하지 않을 수 있습니다. 따라서 .NET을 get_result()
사용하지 않고 제공 하는 기능을 얻는 방법에 대한 정보와 함께이 답변을 게시하는 것이 도움이 될 것이라고 생각했습니다 get_result()
.
get_result()
fetch_array()
결과 집합을 반복하고 결과 집합의 각 행에서 값을 숫자 인덱스 또는 연관 배열에 저장하기 위해 자주 결합 됩니다. 예를 들어, 아래 코드는 fetch_array ()와 함께 get_result ()를 사용하여 결과 집합을 반복하고 각 행의 값을 숫자 인덱스 $ data [] 배열에 저장합니다.
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$result = $stmt->get_result();
while($data = $result->fetch_array(MYSQLI_NUM)) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
그러나를 get_result()
사용할 수없는 경우 (mysqlnd가 설치되어 있지 않기 때문에)를 사용하지 않고 결과 집합의 각 행에서 값을 배열에 저장하는 방법에 대한 문제가 발생합니다 get_result()
. 또는 사용 get_result()
하지 않고 실행 하는 레거시 코드를 마이그레이션하는 방법 (예 :bind_result()
대신 사용)-가능한 한 나머지 코드에 영향을주지 않습니다.
숫자 색인 배열에 각 행의 값을 저장하는 것은 bind_result()
. bind_result()
스칼라 변수 목록이 필요합니다 (배열 아님). 따라서 결과 집합의 각 행에서 값을 배열에 저장하려면 몇 가지 작업이 필요합니다.
물론 코드는 다음과 같이 쉽게 수정할 수 있습니다.
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
그러나이를 위해서는를 호출 할 때 $ data [0], $ data [1] 등을 개별적으로 명시 적으로 나열해야하므로 bind_result()
이상적이지 않습니다. $ data [0], $ data [1], ... $ data [N-1]을 명시 적으로 나열 할 필요가없는 솔루션을 원합니다 (여기서 N은 select 문의 필드 수입니다). 에 대한 호출에서 bind_results()
. 쿼리가 많은 레거시 애플리케이션을 마이그레이션하고 각 쿼리에 select
절 에 다른 수의 필드가 포함될 수있는 경우 마이그레이션은 매우 노동 집약적이며 위와 같은 솔루션을 사용하면 오류가 발생하기 쉽습니다. .
이상적으로는 '드롭 인 교체'코드의 일부가 필요합니다. get_result()
함수를 포함하는 줄 과 다음 줄의 while () 루프 만 교체하는 것 입니다. 대체 코드는 while () 루프 내부의 행을 포함하여 앞 또는 뒤의 행에 영향을주지 않고 대체하는 코드와 동일한 기능을 가져야합니다. 이상적으로는 대체 코드가 최대한 간결 select
하고 쿼리 절의 필드 수를 기반으로 대체 코드를 테일러링 할 필요가 없습니다 .
인터넷에서 검색하면서 bind_param()
with call_user_func_array()
(예 : Dynamically bind mysqli_stmt parameters and then bind result (PHP) ) 와 함께 사용하는 여러 솔루션을 찾았지만, 찾은 대부분의 솔루션은 결국 결과가 아닌 연관 배열에 저장됩니다. 숫자 색인 배열이며 이러한 솔루션 중 상당수는 내가 원하는만큼 간결하지 않았거나 '드롭 인 교체'만큼 적합하지 않았습니다. 그러나 내가 찾은 예를 통해이 솔루션을 조합 할 수 있었는데, 이는 청구서에 부합합니다.
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) {
$var = $i;
$$var = null;
$data[$var] = &$$var;
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
물론 for () 루프를 한 줄로 축소하여 더 간결하게 만들 수 있습니다.
이 방법이 bind_result()
각 행의 값을 숫자 색인 배열에 저장하는 데 사용하는 솔루션을 찾고 있거나 get_result()
. 의견을 환영합니다.
$stmt = $conn->mysqli->stmt_init();
?