我对用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()); 有人能帮我创建一个安全 mysql语句,它使用来自url参数的输入(如上面所示)吗?
额外好处:准备好的语句也会提高速度。如果我只在一页上使用准备好的报表三、四次,它会提高总体速度吗?
发布于 2009-08-17 23:13:40
下面是一个使用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);
}发布于 2009-08-17 23:11:21
您可以这样写:
$qry = "SELECT * FROM mytable where userid='";
$qry.= mysql_real_escape_string($_GET['userid'])."' AND category='";
$qry.= mysql_real_escape_string($_GET['category'])."' ORDER BY id DESC";但是要使用准备好的语句,最好使用泛型库,比如PDO
<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT * FROM mytable where userid=? and category=?
order by id DESC');
$sth->execute(array($_GET['userid'],$_GET['category']));
//Consider a while and $sth->fetch() to fetch rows one by one
$allRows = $sth->fetchAll();
?>或者,使用米斯里
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$category = $_GET['category'];
$userid = $_GET['userid'];
/* create a prepared statement */
if ($stmt = mysqli_prepare($link, 'SELECT col1, col2 FROM mytable where
userid=? and category=? order by id DESC')) {
/* bind parameters for markers */
/* Assumes userid is integer and category is string */
mysqli_stmt_bind_param($stmt, "is", $userid, $category);
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $col1, $col2);
/* fetch value */
mysqli_stmt_fetch($stmt);
/* Alternative, use a while:
while (mysqli_stmt_fetch($stmt)) {
// use $col1 and $col2
}
*/
/* use $col1 and $col2 */
echo "COL1: $col1 COL2: $col2\n";
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>发布于 2009-08-17 23:54:31
我同意其他几个答案:
ext/mysql不支持参数化的SQL语句。mysql_real_escape_string(),它也可能是有效的,但是它的代码更冗长。您还应该注意,即使使用查询参数,仍然必须对SQL注入保持谨慎,因为参数仅取代SQL查询中的文字值。如果动态构建SQL查询,并将PHP变量用于表名、列名或SQL语法的任何其他部分,则在这种情况下,查询参数或mysql_real_escape_string()帮助都不会出现。例如:
$query = "SELECT * FROM $the_table ORDER BY $some_column"; 关于业绩:
https://stackoverflow.com/questions/1290975
复制相似问题