我一直试图找到一个没有fetch数组函数的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);
答案 0 :(得分:2)
虽然我在这段代码中看不到“巨大的安全漏洞”,但我认为无论如何都不值得使用。 看,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