2015-02-05 3 views
1

Я читаю эту книгу «PHP и MySQL Web Development от Луки Веллинг Лаура Томсон Четвертое издание» стр. 751 для тех из вас, кто знаком с этой книгой. Однако в представленном в книге решении используется MySQLi DB Connector, который отлично работает при тестировании. Я хотел бы принять это решение в один из моих проектов, который использует PHP PDO Connector, но у меня возникла проблема, пытаясь получить те же результаты, что и в учебнике. Я хочу немного помочь в преобразовании MySQLi Connector для обработки процесса PDO. Оба примера используют MySQL DB. Я не уверен, что я делаю неправильно и не нуждаюсь в помощи.Как конвертировать MySQLi-коннектор в PHP PDO

Я пытаюсь получить мою процедуру PDO для получения того же результата для расширенного массива по идентификатору children, как и исходный массив текстовых книг, чтобы он работал.

// Example taken from the text book 
function expand_all(&$expanded) { 
    // mark all threads with children as to be shown expanded 
    $conn = db_connect(); 
    $query = "select postid from header where children = 1"; 
    $result = $conn->query($query); 
    $num = $result->num_rows; 
    for($i = 0; $i<$num; $i++) { 
     $this_row = $result->fetch_row(); 
     $expanded[$this_row[0]]=true; 
    } 
} 

// The print_r form the text book example looks like this: 
// result: 
mysqli_result Object ( [current_field] => 0 [field_count] => 1 
         [lengths] => [num_rows] => 3 [type] => 0 
        ) 

// expended: 
    Array ([0] => 1) Array ([0] => 2) Array ([0] => 4) 

//--------------------------------------------------------------// 

// Know, here is my new adopted changes for using PHP PDO connector 
function expand_all(&$expanded) 
{ 
    // mark all threads with children to be shown as expanded 
    $table_name = 'header'; 
    $num = 1; 

    $sql = "SELECT postid FROM $table_name WHERE children = :num"; 

    try 
    { 
     $_stmt = $this->_dbConn->prepare($sql); 
     $_stmt->bindParam(":num", $num, PDO::PARAM_INT); 
     $_stmt->execute(); 

     $result = $_stmt->fetchAll(PDO::FETCH_ASSOC);   

     // get the $expanded children id's 
     foreach ($result as $key => $value) 
     { 
      foreach ($value as $k => $val) 
      { 
       $expanded[$k] = $val; 
      } 
     } 
     return $extended; 
    } 
    catch(PDOException $e) 
    { 
     die($this->_errorMessage = $e); 
    } 

    //close the database 
    $this->_dbConn = null;   
} 

// The print_r for the result looks like this: 
Array ([0] => Array ([children_id] => 1) 
     [1] => Array ([children_id] => 2) 
     [2] => Array ([children_id] => 4) 
     ) 

// The return extended print_r for the children id's 
// look like this: 
    Array ([children_id] => 4); 
+0

Так какая разница вы видите ? –

ответ

0

Вы используете PDO::FETCH_ASSOC и поскольку каждый результат имеет те же имена столбцов вы переопределение значения на каждой итерации вашего цикла.

Если вы хотите, чтобы $ exapnded был массивом идентификаторов, вам нужно настроить ваш цикл, или вы должны использовать PDO::FETCH_COLUMN.

с регулировкой контура:

foreach ($result as $key => $value) 
    { 
     foreach ($value as $k => $val) 
     { 
      $expanded[] = $val; 
     } 
    } 
    return $expanded; 

С выборки регулировки режима:

$_stmt = $this->_dbConn->prepare($sql); 
    $_stmt->bindParam(":num", $num, PDO::PARAM_INT); 
    $_stmt->execute(); 

    $result = $_stmt->fetchAll(PDO::FETCH_COLUMN, 0); 

    // at this point im not sure whay you are both passing 
    // $expanded by reference and returning it... 
    // if you want to overwrite this array just do $expanded = $result 
    // if you need to add these items TO an existing $expanded you can use 
    // $expanded = array_merge($expanded, $result) 

Оба этих метода shoudl даст вам массив, как:

Array(
    0 => 1, 
    1 => 2, 
    2 => 4 
) 
+0

Я вижу вашу точку здесь и в согласии, но в этом ответе будет создан один массив, в котором пример текстовой книги создает 4 массива для расширенных идентификаторов детей. Итак, как я мог сделать то же самое, или это потому, что они используют цикл for? –

Смежные вопросы