【问题标题】:MySQLi prepared results arrayMySQLi 准备结果数组
【发布时间】:2013-03-14 04:47:13
【问题描述】:

我一直在尝试为没有获取数组函数的 MySQLi stmt 找到解决方案,我发现了这段有趣的代码。你认为这段代码值得使用,没有巨大的安全漏洞吗?

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

【问题讨论】:

    标签: php arrays mysqli


    【解决方案1】:

    虽然我在这段代码中没有看到“巨大的安全漏洞”,但我认为无论如何都不值得使用。 看,mysqli 让你无处可去。 旧的 mysql 没有这样的问题,PDO 没有这样的问题。只有mysqli无缘无故让你的生活变得复杂。

    有时您可以通过使用get_result() 来解决此问题,但它不保证可以正常工作,甚至不绑定到 PHP 版本 - 所以,您甚至无法事先告诉它。

    更不用说尝试将任意数量的占位符绑定到查询中会遇到同样的问题,甚至没有半可行的解决方案!

    那么,再一次 - 与其解决所有这些问题 - 为什么不使用像 PDO 这样的合理驱动程序?
    使用 PDO,您可以直接使用熟悉的 fetch(),而无需像上面的代码这样的拐杖。

    另一个解决方案是避免使用本机准备好的语句,并使用它们手动解析的等效语句,使用 mysqli_query(),它在任何方面都类似于旧的好 mysql_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
    

    【讨论】:

    • 我编写程序代码是因为我发现它更容易读写,尤其是学习。在连接的 OOP 和其余代码的程序之间跳转会有什么问题吗?学习一点 OOP 可能比处理 STMT 更容易。
    • 如果您通过添加完整的查询处理代码来编辑您的问题,从定义查询到获取所有数据,我将能够将其重写为 PDO,以向您展示 OOP 样式实际上是十读写时间更短、更清晰。
    • 如果我看到我的代码的直接副本会更容易学习。清理代码,我更新了 OP。提前致谢!
    • 感谢它帮助我将我的代码版本与文档的版本进行比较以理解它!
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多