2013-03-14 12 views
0

MySQLi stmt에 대한 가져 오기 배열 기능이없는 해결책을 찾기 위해 노력 중이며이 재미있는 코드가 있습니다. 이 코드가 사용 가치가 있다고 생각합니까? 거대한 보안 결함이 있습니까?MySQLi 준비 결과 배열

/* 
* Utility function to automatically bind columns from selects in prepared statements to 
* an array 
*/ 
function bind_result_array($stmt) 
{ 
    $meta = $stmt->result_metadata(); 
    $result = array(); 
    while ($field = $meta->fetch_field()) 
    { 
     $result[$field->name] = NULL; 
     $params[] = &$result[$field->name]; 
    } 

    call_user_func_array(array($stmt, 'bind_result'), $params); 
    return $result; 
} 

/** 
* Returns a copy of an array of references 
*/ 
function getCopy($row) 
{ 
    return array_map(create_function('$a', 'return $a;'), $row); 
} 

신용 : 상식에 의해 요청 된 http://gunjanpatidar.wordpress.com/2010/10/03/bind_result-to-array-with-mysqli-prepared-statements/

: 나는이 코드에는 "큰 보안 결함"을 참조하십시오 없지만

$db = new PDO("mysql:host='localhost';dbname='testing'", 'username', 'password') or die('Could not connect to server'); 
$get_posts = mysqli_stmt_init($db); 
mysqli_stmt_prepare($get_posts, 'select * from Chatposts where Chatid = ? and CPid > ? and Deleted = ? order by CPid desc limit ?'); 
mysqli_stmt_bind_param($get_posts, 'iiii', $chatroomid, $lastpost, $deleted, $limit); 
mysqli_stmt_execute($get_posts); 
mysqli_stmt_bind_result($get_posts, $newcolumn['ID'], $newcolumn['Chatid'], $newcolumn['Name'], $newcolumn['URL'], $newcolumn['Text'], $newcolumn['Datetime'], $newcolumn['IPaddress'], $newcolumn['Deleted']); 
mysqli_stmt_store_result($get_posts); 
mysqli_stmt_fetch($get_posts); // Trying to fetch array 
mysqli_stmt_close($get_posts); 

답변

2

, 나는 어쨌든 이용 가치가 있다고 생각하지 않습니다. 봐봐, mysqli는 너를 곤란하게 만든다. 이전 mysql에 대한 그런 문제가 없었습니다. PDO에는 그런 문제가 없습니다. mysqli만이 당신의 삶을 아무런 이유없이 복잡하게 만듭니다.

가끔 get_result()을 사용하여이 문제를 해결할 수 있지만이 작동하지 않을 수도 있고 도 작동하지 않을 수 있으며 PHP 버전에도 구속되지 않습니다. 따라서 미리 말할 수도 없습니다.

과 동일한 문제가있어서 검색어에 임의의 수의 자리 표시자를 바인딩 할 수 있으며 반 가공 솔루션도 없습니다!

다시 말해, 이러한 모든 문제를 해결하는 대신 PDO와 같은 현명한 드라이버를 사용하지 않는 이유는 무엇입니까?
PDO를 사용하면 위의 코드와 같은 목발을 사용하지 않고 익숙한 fetch()를 바로 사용할 수 있습니다.

또 다른 해결책은 네이티브 준비 문을 사용하지 말고 어떤 방식 으로든 오래된 좋은 mysql_query와 유사한 mysqli_query()을 사용하여 수작업으로 파싱 된 동등 물을 사용하는 것입니다.
그러나이 방법은 일반 사용자에게는 너무 복잡해 보입니다. 따라서 PDO을 사용하는 것이 좋습니다.

는 여기에 특히 배우고, 나는 그것이 너무 쉽게 읽고 쓸 발견하면 내 코드는 절차 쓰기 PDO

$dsn = "mysql:host=localhost;dbname=test;charset=utf8"; 
$opt = array(
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
    PDO::ATTR_EMULATE_PREPARES => FALSE, 
); 
$pdo = new PDO($dsn,'root','', $opt); 

$stm = $pdo->prepare('select * from Chatposts where Chatid = ? and CPid > ? and Deleted = ? order by CPid desc limit ?'); 
$stm->execute(array($chatroomid, $lastpost, $deleted, $limit)); 
$posts = $stm->fetchAll(); 
// now you have all requested posts in $posts array 
+0

를 사용하여 코드입니다. 연결을위한 OOP와 나머지 코드를위한 절차 간 점프에 어떤 문제가 있습니까? STMT를 다루는 것보다 좀 더 쉽게 OOP를 배울 수 있습니다. – Rujikin

+0

쿼리 처리를위한 전체 코드를 추가하여 질문을 편집하면 쿼리 정의에서 모든 데이터 가져 오기까지 PDO로 다시 작성하여 OOP 스타일이 실제로는 10 배 더 짧고 읽기 쉽도록 표시 할 수 있습니다. 쓰다. –

+0

내 코드의 직접적인 복사본을 본다면 배우기가 훨씬 쉬울 것입니다. 코드를 정리하고 OP를 업데이트했습니다. 미리 감사드립니다 !! – Rujikin

관련 문제