【问题标题】:Printing an entire SQL result from a prepared statement in PHP从 PHP 中的准备语句打印整个 SQL 结果
【发布时间】:2014-08-18 15:13:57
【问题描述】:

我正在尝试构建一个函数,允许我在我的代码中抽象 mysqli 函数的使用。目前我有一个使用标准 SQL 的工作版本(没有准备好的语句)。

function mySqlQueryToArray($con, $sql){
    // Process SQL query
    $result = mysqli_query($con, $sql);

    if(mysqli_error($con)){
        out($sql . "\n");
        exit("ERROR: MySQL Error: " . mysqli_error($con));
    }

    // Put result  into 2D array
    $output = array();
    while($row = mysqli_fetch_assoc($result)) {
        array_push($output, $row);
    }

    return $output;
}

现在我正在尝试将该代码转换为可以使用准备好的语句的东西,但我的研究表明,在使用准备好的语句时,您需要使用 mysqli_stmt::bind_result 将每一列绑定到不同的变量,这会导致问题,因为要点该功能的作用是为任意 SQL 查询工作。

我的主要问题是:有没有办法在二维数组中打印出 SQL 查询的整个输出,就像上面的函数使用准备好的语句一样?

这是我当前使用准备好的语句的代码,它包含除了 bind_result 之外的所有内容。

//Creates a MySQL Query, gets the result and then returns a 2D array with the results of the query
function mySqlQueryToArray($con, $sql, $params){
    // Prepare SQL query
    $stmt = $con->prepare($sql);

    if(mysqli_error($con)){
        echo "$sql=>\n" . print_r($params, true) . "\n";
        exit("$sql=>\n" . print_r($params, true) . "\nERROR: MySQL Error: " . mysqli_error($con));
    }

    // Bind parameters
    foreach($params as $param){
        $type = "s";
        if(gettype($param) == 'integer'){
            $type = "i";
        }
        $stmt->bind_param($type, $param);
    }

    //execute query
    $stmt->execute();

    // Put result  into 2D array
    $output = array();
    // ??? need to bind results and get them into an array somehow

    //close prepared statement
    $stmt->close();

    return $output;
}

【问题讨论】:

  • 用 mysqli 获取实际查询是不可能的
  • 我认为在这类事情上使用 PDO 而不是 mysqli 会更容易。在处理准备好的语句时,您将拥有更大的灵活性。

标签: php mysqli prepared-statement


【解决方案1】:

PDO 原来是答案。我觉得我应该发布我创建的代码来解决我的问题。感谢@Don'tPanic 的提示。

function pdoQuery($sql, $params){
    $db = new PDO('mysql:host=localhost;dbname=My_Database;charset=utf8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    try {
        $stmt = $db->prepare($sql);
        $stmt->execute($params);
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $rows;
    }catch(PDOException $ex){
        echo "ERROR: SQL Error: $sql";
        // logError("ERROR: SQL Error: $sql");
    }
}

【讨论】:

    最近更新 更多