-1

在我的 PHP 文档中,我得到一个如下所示的 SQL 查询:

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT * FROM `objekt_t` WHERE `id`='" . $id . "'";
    $row = mysqli_query($con, $q) or die(mysqli_error($con));
    while($r = mysqli_fetch_assoc($row))
    {
        $objekt = $r;
    }
}

我意识到这是关于 SQL 注入等非常不安全的做法,所以我一直在研究准备好的 SQL 查询,使用绑定参数。查看bobby-tables.com我看到了这个示例查询:

$stmt = $db->prepare('update people set name = ? where id = ?');
$stmt->bind_param('si',$name,$id);
$stmt->execute();

我不明白我应该如何修改我当前的查询以匹配使用绑定参数的更安全的查询。任何帮助表示赞赏。

4

3 回答 3

1

准备好的语句将原始数据传输到查询,因此无法进行 SQL 注入。无需转义 forreal_escape_String或任何其他格式化功能,因为它会为您完成。

例子:

$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE Username=?");
$statement->bind_param('s',$_POST['Username']);
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();

我基本上将我的 $_POST 数据直接绑定到查询,因为数据是作为原始数据发送的,所以即使查询包含注入形式,如 $_POST['username']; 查询将正常运行。


就过程和 OOP 风格而言,这取决于偏好,我个人更喜欢 OOP 风格而不是其他选项,因为它更具可读性。

处理数字:

$ID= 5;
$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE ID=?");
$statement->bind_param('i',$ID);
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();

或者您可以直接在语句中使用精确值:

$db = new mysqli ("host","user","password","database");
$statement = $db->prepare("SELECT test FROM test WHERE ID='5'");
$statement->execute();
$statement->bind_result($resultCol);
$statement->fetch();
$statement->close();
于 2013-04-14T15:42:37.300 回答
1

一样的方式

$mysqli = new mysqli("localhost", "my_user", "my_password", "db");

if(isset($_GET['id']))
{
    $id = $_GET['id'];
    $q = "SELECT some_field FROM `objekt_t` WHERE `id`= ?";

    if ($stmt = $mysqli->prepare($q)) {    
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $stmt->bind_result($result);
        $stmt->fetch();
    }
}

现在 $result 变量包含查询的结果。

于 2013-04-14T15:43:24.100 回答
0

你可以这样做:

$stmt = $mysqli->prepare('SELECT * FROM objekt_t WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();

$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // $row is an associative array
}
于 2013-04-14T15:49:42.880 回答