我正在尝试使用以下查询将一些表单数据存储到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'];
有人可以帮忙吗?
答案 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()