Possible Duplicate:
How can I prevent SQL injection in PHP?

这就是W3学校的例子.组织:

HTML格式:

<html>
    <body>
        <form action="insert.php" method="post">
            Firstname: <input type="text" name="firstname" />
            Lastname: <input type="text" name="lastname" />
            Age: <input type="text" name="age" />
            <input type="submit" />
        </form>
    </body>
</html>

文件插入.php:

<?php
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("my_db", $con);

    $sql="INSERT INTO Persons (FirstName, LastName, Age)
          VALUES
          ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

    if (!mysql_query($sql,$con))
    {
        die('Error: ' . mysql_error());
    }
    echo "1 record added";

    mysql_close($con)
?>

我已经通读了这里的其他问题,但我找不到直接的答案,因为大多数问题要复杂得多.

我看了100,但我对如何修改这个有点困惑:

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $unsafeValue));

假设我使用了上面的HTML表单,并希望将字段"firstname"中的数据插入数据库,它应该是这样的吗?还是我应该修改column

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $firstname));

推荐答案

您提供的示例将post变量插入到数据库中,而不首先分析它们是否存在恶意用户输入.在使用类型转换、转义/过滤函数、准备好的语句等与数据库交互之前,请先使用它们.

一般的规则是永远不要相信用户的输入.曾经

退房:Best way to stop SQL Injection in PHP

为了回答您的问题,下面是如何使用PDO准备的语句处理整个表单.

$stmt = $db->prepare('INSERT INTO Persons (FirstName, LastName, Age) VALUES (:first_name, :last_name, :age)');

$stmt->execute(array(':first_name' => $first_name,':last_name' => $last_name, ':age' => $age));

如果您只想按要求在记录中插入一列,语法如下:

$stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)');

$stmt->execute(':first_name', $first_name);

Mysql相关问答推荐

当日期附加到MySQL后,如何按日期说明排序?

JPA对具有动态键和动态值的JSON列的原生查询

提高bash脚本从大型gml文件读取数据的效率

从表中 Select 具有不同顺序的列

mysql 代码给我的外键格式不正确

从单行中获取最大日期的最佳方法

如何通过SQL来计算到达特定值的行的数量

Mysql时间序列数据的最小值和最大值

判断一列中的多个值并返回值 1 或 0

访问 nodejs、mysql 和 json 中的嵌套对象数组

MySQL 中的 LATERAL 语法 - 是否只是说左表首先执行以便下一个可以引用它?

如何将表的链接列转换为 SQL 中的行?

在 MySQL 的存储过程中调用存储过程

让 MySQL 在 OSX 10.7 Lion 上运行

PHP 判断 NULL

Mysql中int(10)的最大大小是多少

比较 MySQL 中的日期忽略 DateTime 字段的时间部分

表被指定了两次,既作为更新的目标,又作为 mysql 中数据的单独源

Mysql 错误:try 转储表空间时,指定为定义者的用户 ('mysql.infoschema'@'localhost') 不存在'

AWS RDS 实例升级停机时间