PHP插入MySQL语法错误

时间:2013-03-23 16:12:40

标签: php mysql sql phpmyadmin

我无法通过php向MySQL提交一些数据,我收到以下错误:

“错误:您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以便在''student'附近使用正确的语法(UID,FirstName,LastName,DOB,EmergencyContact,地址,城市,州'在第1行“

我不确定我哪里出错了,任何帮助都会很棒。

<?php
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$dob = $_POST['dob'];
$emergencycontact = $_POST['emergencycontactperson'];
$address = $_POST['addressline1'];
$city = $_POST['city'];
$state = $_POST['state'];
$zip = $_POST['zip'];
$homephone = $_POST['homephone'];
$cellphone = $_POST['cellphone'];
$guardian = $_POST['guardian'];
$inneighborhood = 0;
if ($zip == "49503")
    $inneighborhood = 1;

$con = mysqli_connect("localhost", "cookarts_root", "password", "cookarts_database");

// Check connection
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql = "INSERT INTO 'student' (FirstName, LastName, DOB, EmergencyContact, Address,       City, State, ZIP, CellPhone, HomePhone, Guardian, InNeighborhood)
VALUES
($firstname', '$lastname', '$dob', '$emergencycontact', '$address', '$city', '$state', '$zip', '$cellphone', '$homephone', '$guardian', '$inneighborhood')";

if ($con->query($sql) === TRUE) {
      echo 'users entry saved successfully';
}   
else {
  echo 'Error: '. $con->error;
}

mysqli_close($con);
?>

enter image description here

如果您需要更多信息,我很乐意提供,请再次感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

TableNames是标识符,因此不应使用单引号引用它们。由于您使用的tableName不是保留关键字,因此您只需删除那些包装引号,

INSERT INTO student (FirstName, LastName....

当您使用单引号包装内容时,它会强制该对象成为字符串文字。因此,当标识符用单引号括起来时,意味着它们不再是标识符。

服务器抛出异常,因为INSERT INTO期望标识符不是字符串文字。

如果您不小心使用了MySQL Reserved Keyword的表名,请不要使用单引号来标识标识符,而是使用backticks

作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

答案 1 :(得分:2)

将您的查询更改为

$sql = "INSERT INTO student (FirstName, LastName, DOB, EmergencyContact, Address,                City, State, ZIP, CellPhone, HomePhone, Guardian, InNeighborhood)
    VALUES
   ('$firstname', '$lastname', '$dob', '$emergencycontact', '$address', '$city', '$state', '$zip', '$cellphone', '$homephone', '$guardian', '$inneighborhood')";

不要在表名附近使用引号

答案 2 :(得分:1)

看起来你也错过了一些东西:

你有:
($姓名”,

应该是:(开头时缺少)
( '$姓名',

但即便如此,您可能还想使用“(引号)”并将其转义为:

(\ “$姓名\”,

你的INSERT INTO线上地址和城市之间也有很多空间...... 地址,城市

是的,你应该用`

来逃避你的mysql字段名