【问题标题】:Issue storing data to SQL DB将数据存储到 SQL DB 的问题
【发布时间】:2013-09-03 11:45:30
【问题描述】:

我正在尝试使用以下查询将一些表单数据存储到 SQL 数据库:

$sql = "INSERT INTO attendees (first_name, surname, partner, phone) VALUES ($first_name, $surname, $partner, $phone)";

如果我对值进行硬编码来测试它,它会完美运行,但是在使用这些变量时,它会中断并给我 Error 1054

$first_name = $_POST['first_name'];
$surname    = $_POST['surname'];
$partner    = $_POST['partner'];
$phone  = $_POST['phone'];

有人可以帮忙吗?

【问题讨论】:

标签: php sql forms


【解决方案1】:
$sql = "INSERT INTO attendees (first_name, surname, partner, phone) VALUES ($first_name, $surname, $partner, $phone)";

应该是

$sql = "INSERT INTO attendees (first_name, surname, partner, phone) VALUES ('$first_name', '$surname', '$partner', '$phone')";

您在字段内容周围缺少引号。

警告:您的代码容易受到 SQL 注入攻击

尝试使用 PHP Prepared statement 和维基页面 http://en.wikipedia.org/wiki/Prepared_statement 。或者至少使用mysqli_real_escape_string

【讨论】:

  • 此方案易受 SQL 注入攻击。请解决这个问题或至少提及它。
  • @Bluewind 感谢您的指出。不知道我是怎么错过的。
【解决方案2】:

Err 1054 表示您使用的列名不存在。

在这种情况下,由于您的插入语句似乎没有任何问题(假设所有变量中都有数据),这意味着您可能拼写了列名。

再想一想,您可能需要在字符串周围加上单引号,但我的答案的第一部分仍然有效。

【讨论】:

    【解决方案3】:

    首先,停止使用mysql_函数,寻找PDO和prepared statements:如果你按照建议去做,这个问题将自行排序。

    无论如何,问题在于查询会将值替换为包含在您的 $_POST 数组中的字符串...但没有字符串分隔符。

    这意味着mysql会将它们视为列名,空格会破坏它们!

    解决方案:

    $sql = "INSERT INTO attendees (first_name, surname, partner, phone) VALUES ('$first_name', '$surname', '$partner', '$phone')";
    

    请注意,这将使您容易受到 SQL 注入攻击!

    使用 PDO,它看起来类似于:

    $stmt = $db->prepare("INSERT INTO attendees (first_name, surname, partner, phone) VALUES (:fname, :sname, :partn, :phone)");
    $stmt->execute(array(':fname' => $first_name, ':sname' => $surname_name, [the others]))
    

    这将更加安全,而且明显更好。

    【讨论】:

      【解决方案4】:

      请转义并验证您的输入,否则您将容易受到 SQL 注入的攻击。

      以下是有关如何执行此操作的良好解决方案列表:http://bobby-tables.com/php.html

      如果可能的话基本上尽量使用prepared statements,否则使用mysql_real_escape_string()

      【讨论】:

        猜你喜欢
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        相关资源
        最近更新 更多