0

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

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

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

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

有人可以帮忙吗?

4

4 回答 4

3
$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 语句和 wiki 页面http://en.wikipedia.org/wiki/Prepared_statement。或者至少使用mysqli_real_escape_string

于 2013-09-03T11:47:50.927 回答
0

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

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

如果可能,基本上尝试使用准备好的语句,否则使用mysql_real_escape_string()

于 2013-09-03T11:51:58.570 回答
0

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

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

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

于 2013-09-03T11:48:10.640 回答
0

首先,停止使用 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]))

这将更安全,更明显更好。

于 2013-09-03T11:51:29.687 回答