PHP 및 MYSQLi - 루프를 사용하여 매개변수를 바인딩하고 배열에 저장하시겠습니까?
문제
다음 코드를 사용하면 설명하기가 더 쉬울 것입니다(그런데 틀렸습니다).
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre = ?';
if ($stmt->prepare($selectGenre_sql)) {
// bind the query parameters
$stmt->bind_param('s', $genre);
// bind the results to variables
$stmt->bind_result($genres);
// execute the query
$stmt->execute();
$genre = array();
while ($stmt->fetch()) {
$genre[] = $genres;
}
}
위 코드는 'dbGenre'가 '$genre'와 같을 때 'genreID'에서 값을 가져옵니다.그런 다음 결과를 배열에 저장합니다.그런데 저는 일을 안 해요.왜?'$genre'는 배열이기 때문에 매번 'genreID'에서 다른 값을 얻으려면 이를 반복해야 한다고 생각합니다.
$genre는 영화 장르를 포함하는 열거형 배열입니다. 예를 들면 다음과 같습니다.
[0] => 액션 [1] => 어드벤처 [2] => 판타지
값을 비교해야 합니다(예: 'Action').
'genres' 테이블에는 두 개의 열이 포함되어 있습니다. 장르ID(INT) 그리고 db장르(VARCHAR)
각 장르 ID(숫자)만 있으면 됩니다....의 말을하자..dbGenre가 Action과 같을 때, GenreID를 array1에 저장하고, $genre 배열을 반복하여 다음 값에 대한 GenreID를 얻고 이를 array1에 다시 저장합니다.
어떻게 고칠 수 있나요??저는 프로그래밍이 처음이므로 최대한 자세히 설명해주세요.감사해요!!
해결책
배열을 SQL 매개변수에 바인딩할 수 없습니다.대신 SQL에서 매개변수를 사용할 수 있습니다. 단일 리터럴 값.값 목록, 표현식, 열 이름 또는 테이블 이름이 아닙니다.
귀하의 경우 작업을 해결하려면 다음 두 가지 솔루션 중 하나를 사용할 수 있습니다.
첫 번째 해결 방법:루프 오버 $genre
배열을 만들고, 각 값을 한 번에 하나씩 바인딩하고, 각 값에 대해 SQL 쿼리를 실행합니다.
if ($stmt->prepare($selectGenre_sql)) {
$genre = array();
foreach ($gengre as $genreID) {
$stmt->bind_param('s', $genreID);
$stmt->execute();
$stmt->bind_result($genres);
while ($stmt->fetch()) {
$genre[] = $genres;
}
}
}
두 번째 해결 방법:배열의 각 값에 대해 하나씩 여러 매개변수를 사용하여 쿼리를 한 번 실행합니다.이를 위해서는 가변 개수의 변수를 구축하기 위한 까다로운 코드가 필요합니다. ?
SQL 쿼리의 자리 표시자(쉼표로 구분)
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN ('
. join(',', array_fill(0, count($genre), '?')) . ')';
if ($stmt->prepare($selectGenre_sql)) {
$genre = array();
. . .
그리고 당신은 까다로운 전화를 받아야합니다 bind_param()
요소에 따라 다양한 수의 인수를 사용합니다. $genre
정렬:
. . .
call_user_func_array( array($stmt, 'bind_param'),
array_unshift($genre, str_repeat('i', count($genre)));
$stmt->execute();
$stmt->bind_result($genres);
while ($stmt->fetch()) {
$genre[] = $genres;
}
}
사용을 고려해 볼 수도 있습니다. PDO::mysql
배열에서 매개변수를 바인딩하는 것이 더 쉽기 때문입니다.이 경우에는 MySQLi 인터페이스가 꽤 어색합니다.
다른 팁
@ Bill Karwin
call_user_func_array는 참조별로 Args를 전달하지 않으므로 값이 전달되므로 작동하지 않습니다! 그것은 당신에게 stmt-> bind_param 오류를 줄 것입니다
PDO는 더 나은 솔루션이 아닙니다 ... u 아직도 그것에 대해서도 해결해야 할 일이 있어야합니다.
이것은 당신의 게시물에서 편집해야합니다.
if($stmt = ...same as yours) {
array_unshift($genre, str_repeat('i', count($genre)));
$temp = array();
foreach($genre as $key => $value) {
$temp[$key] = &$genre[$key];
}
call_user_func_array(array($stmt, 'bind_param'), $temp);
etc...
}
몇 가지.
- $ 장르 var를 덮어 쓰고 Sedond 사건에서 $ gerearray로 변경했기 때문일 수 있습니까?
데이터베이스가 실제로 물건을 반환하고 있는지 확인하십시오 (phpmyadmin 또는 이와 유사한 것으로 시도하십시오).
다음과 같은 처리를 시도하십시오.
.
$genreId = -1;
$stmt->bind_results($genreId);
$stmt->execute();
while($stmt->fetch()){
$genreArray[] = $genreId;
}