如何将 MySQLi 连接器转换为 PHP PDO

Posted

技术标签:

【中文标题】如何将 MySQLi 连接器转换为 PHP PDO【英文标题】:How to convert MySQLi connector to PHP PDO 【发布时间】:2015-04-05 23:58:04 【问题描述】:

我正在阅读这本书“Luke Welling Laura Thomson 第四版的 phpmysql Web 开发”第 751 页,供熟悉这本书的读者阅读。 然而,书中提供的解决方案是使用 MySQLi DB 连接器,它在测试时工作正常。我想在我的一个使用 PHP PDO 连接器的项目中采用这个解决方案,但是我在尝试得出与教科书相同的结果时遇到了问题。我正在寻求一些帮助来转换 MySQLi 连接器以处理 PDO 过程。这两个示例都使用 MySQL DB。我不确定自己做错了什么并且寻求的帮助很少。

我正在尝试让我的 PDO 过程为子 ID 上的扩展数组生成与原始教科书数组相同的结果。

// 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); 

【问题讨论】:

那么你看到了什么不同? 【参考方案1】:

您正在使用PDO::FETCH_ASSOC,并且由于每个结果具有相同的列名,因此您将在循环的每次迭代中覆盖这些值。

如果你想让 $exapnded 成为一个 id 数组,你需要调整你的循环或者你应该使用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)

这两种方法都应该给你一个像这样的数组:

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

【讨论】:

我明白你的观点并同意,但这个答案将产生一个数组,其中教科书示例为扩展的儿童 ID 生成 4 个数组。那么,我该怎么做呢,还是因为他们使用了 for 循环?

以上是关于如何将 MySQLi 连接器转换为 PHP PDO的主要内容,如果未能解决你的问题,请参考以下文章

php? PDO 或 mySQLi [重复]

php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例

php中使用mysqli和pdo扩展,测试连接mysql数据库的效率。

mysql连接选mysqli还是PDO

如何配置 php 以在 CentOS 上启用 pdo 并包含 mysqli?

php+mysql 请问:用pdo如何获取某个表中记录的数目?