PHP 및 MYSQLi - 루프를 사용하여 매개변수를 바인딩하고 배열에 저장하시겠습니까?

StackOverflow https://stackoverflow.com/questions/627763

문제

다음 코드를 사용하면 설명하기가 더 쉬울 것입니다(그런데 틀렸습니다).

        $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;
 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top