将数据存储到SQL DB的问题

时间:2013-09-03 11:45:30

标签: php sql forms

我正在尝试使用以下查询将一些表单数据存储到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 个答案:

答案 0 :(得分: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 statement和wiki页面http://en.wikipedia.org/wiki/Prepared_statement。或者至少使用mysqli_real_escape_string

答案 1 :(得分:0)

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

在这种情况下,因为你的insert语句似乎没有任何问题(假设所有变量都包含数据),这意味着你可能错误地输入了一个列名。

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

答案 2 :(得分:0)

首先,停止使用mysql_函数并查找PDO和预处理语句:如果按照建议执行,此问题将自行排序。

无论如何,问题是查询会将值替换为$_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]))

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

答案 3 :(得分:0)

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

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

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