我目前正在切换我在Dreamweaver中制作的网站,该网站使用了大量的mysql到mysqli以获得更好的安全性。
我的网站以准备声明开始:
if (!isset($_GET['orderby']) or ($_GET['orderby'])=="Something") {
$orderby = "Something Else";
} else {
$orderby = $_GET['orderby'];
}
if ($stmt = $local->prepare("SELECT * FROM Table ORDER BY ? ASC LIMIT 0,10")) {
$param = "Table." . $orderby;
$stmt->bind_param('s', $param);
$stmt->execute();
$Recordset1 = $stmt->get_result();
$row_Recordset1 = $Recordset1->fetch_assoc();
$stmt->close();
}
这被调用,表格在我的网站上制作。我曾经在表格上方有4个HREF链接,这些链接会更改所选列('?')并使用新查询刷新页面(PHP_self)。
<?php
echo '<a href='.htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8").'?orderby=Up>Popularity</a>';
?>
每当我点击链接时,它会添加&#34;?orderby = Up&#34;到地址但不刷新查询。我是否以错误的方式设置准备好的声明以实现此目的?
答案 0 :(得分:1)
是的,准备好的陈述很好,但限制是:
您无法绑定表/列名称。
你可以将它们列入白名单:
// define your table columns
$columns_on_that_table = array('id', 'name', 'date');
if (isset($_GET['orderby']) && in_array($_GET['orderby'])) {
$orderby = $_GET['orderby']
} else {
$orderby = 'id'; // default order column
}
$row_Recordset1 = array();
if ($stmt = $local->prepare(" SELECT * FROM Table ORDER BY `$orderby` ASC LIMIT 0,10 ")) {
$stmt->execute();
$Recordset1 = $stmt->get_result();
// loop them if you want more than one row
while($row = $Recordset1->fetch_assoc()) {
$row_Recordset1[] = $row;
}
$stmt->close();
}