我是第一次使用php在mysql中使用预备语句。我需要一些帮助来创建准备好的语句来检索列。
我需要从不同的列中获取信息。当前,对于测试文件,我使用 完全不安全的 SQL语句:
$qry = "SELECT * FROM mytable where userid='{$_GET['userid']}' AND category='{$_GET['category']}'ORDER BY id DESC" $result = mysql_query($qry) or die(mysql_error());
有人可以帮我使用准备好的url参数(如上所述)创建 安全的 mysql语句吗?
奖励:准备语句也可以提高速度。如果我仅在页面上使用三到四次准备好的语句,是否会提高整体速度?
这是一个使用mysqli的示例(对象语法-如果需要,可以很容易地转换为函数语法):
$db = new mysqli("host","user","pw","database"); $stmt = $db->prepare("SELECT * FROM mytable where userid=? AND category=? ORDER BY id DESC"); $stmt->bind_param('ii', intval($_GET['userid']), intval($_GET['category'])); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($column1, $column2, $column3); while($stmt->fetch()) { echo "col1=$column1, col2=$column2, col3=$column3 \n"; } $stmt->close();
另外,如果您想要一种简单的方法来获取关联数组(供SELECT *使用),而不必确切指定要绑定的变量,那么这是一个方便的函数:
function stmt_bind_assoc (&$stmt, &$out) { $data = mysqli_stmt_result_metadata($stmt); $fields = array(); $out = array(); $fields[0] = $stmt; $count = 1; while($field = mysqli_fetch_field($data)) { $fields[$count] = &$out[$field->name]; $count++; } call_user_func_array(mysqli_stmt_bind_result, $fields); }
要使用它,只需调用它而不是调用bind_result即可:
$stmt->store_result(); $resultrow = array(); stmt_bind_assoc($stmt, $resultrow); while($stmt->fetch()) { print_r($resultrow); }