2014-04-08 3 views
1

$params이라는 배열로 준비된 명령문을 생성하고 싶습니다. 내 스크립트를 실행할 때 다음과 같은 오류 얻을 :준비된 명령문의 배열이 작동하지 않습니다.

Fatal error: Call to a member function bind_param() on a non-object in /home/morea/directory-new.php on line 110

라인 110) ($stmt->bind_param('i', $place_holders);

$params = array(5, 6, 7, 9, 10, 11, 12, 3, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 4, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42); 
/* Create a string for the parameter placeholders filled to the number of params */ 
$mysqli = new MySQLi("localhost", "erpa", "48p", "le3"); 
$mysqli->set_charset('utf8'); 
$place_holders = implode(',', array_fill(0, count($params), '?')); 
$sth = ("SELECT u.url, COUNT(u.url) AS total, u.SiteTypeID, p.SiteType FROM sites AS u LEFT JOIN sitetypes AS p USING (SiteTypeID) WHERE SiteTypeID=($place_holders)"); 
$stmt = $mysqli->prepare($sth); 
$stmt->bind_param('i', $place_holders); 
$stmt->execute($params); 
$query5 = mysqli_query($dbc, $sth); 

while($row2 = mysqli_fetch_array($sql3, MYSQLI_ASSOC) && $row4 = mysqli_fetch_array($query5, MYSQLI_ASSOC)){ 
if ($row4['SiteType'] == 'selected'){ 
    $list .= $row4['total']; 
    $list .= '<option value="'.$row4['SiteTypeID'].'"'; 
    $list .= "selected='selected'>"; 
    $list .= $row4['SiteType']; 
    $list .= "</option>"; 
} 
} 
+0

왜 mysqli_query ($ dbc, $ sth);가 있습니까? –

+0

fetch_array를 내 sql 문과 함께 사용 하시려면 – user3286022

+0

그건 mysqli_query를 올바르게 사용하지 않았습니다. –

답변

1

당신은 준비 호출 한 후 $ stmt를 확인해야합니다. 쿼리가 WHERE SiteTypeID IN ($place_holders)를 사용해야하기 때문에 아마 거짓되지 WHERE SiteTypeID=($place_holders);

편집 : 또한 (! 감사 로켓) (현재 허용 대답을 모든 문제를 커버해야한다) bind_params()를 매개 변수 목록이 아닌 배열을 기대하고, execute()에는 매개 변수가 필요 없습니다. 이 함수에 대한 PHP 문서를 두 번 확인하십시오 (http://us.php.net/manual/en/mysqli-stmt.bind-param.php). 배열에 바인딩하고 싶다면, mysqli보다 코드 작성에 훨씬 더 좋은 PDO를 사용해보십시오.

+0

안녕 롭, 그냥 당신이 말한, 시도하고 도움이 될 것 같아요,하지만 이제 변수 수를 준비된 문에서 매개 변수 수를 일치하지 않습니다 – user3286022

+0

@ user3286022 :'$ stmt-> bind_param ('i', $ sti);'. 여러 개의 '?'를 바인딩하고 있지만 그 중 하나의 값만 보냅니다. –

+0

안녕하세요, Rocket, 알았습니다. $ stmt-> bind_param ('i', $ place_holders)로 시도해 보았습니다. 대신 변수의 수가 준비된 명령문의 매개 변수 수와 일치하지 않는다고 알려줍니다. 내 배열의 항목 수를 세 었는데 테이블의 항목 수와 일치합니다. – user3286022

0

의 값을 각각? 개로 보내야합니다. 또한 참조 할 값이 필요합니다. 또한 ->execute()은 매개 변수를 사용하지 않습니다. 마지막으로 mysqli_query()이 올바르지 않습니다.

$stmt = $mysqli->prepare($sth); 

$boundParams = array(str_repeat('i', count($params))); 
foreach($params as &$val){ 
    $boundParams[] =& $val; 
} 
call_user_func_array(array($stmt, 'bind_param'), $boundParams); 

$stmt->execute();  
$query5 = $stmt->get_result(); 

// then you can run mysqli_fetch_array on $query5 

참고 : get_result() 당신이 mysqlnd 드라이버가 설치되어 있어야합니다.

P. WHERE SiteTypeID=($place_holders)WHERE SiteTypeID IN ($place_holders)이어야합니다.

관련 문제