Php PDOException SQLSTATE[42000]:语法错误或访问冲突:1064

Php PDOException SQLSTATE[42000]:语法错误或访问冲突:1064,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试使用php通过注册表获取条目。但我得到了以下错误: 带有消息“SQLSTATE[42000]的异常“PDOException”:语法错误或访问冲突:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行的“”附近使用的正确语法 这是我的密码: if($_SERVER['REQUEST_METHOD']=='POST'){ $name = trim($_POST['name']); $contact= trim($_POST['contact']);

我正在尝试使用php通过注册表获取条目。但我得到了以下错误:

带有消息“SQLSTATE[42000]的异常“PDOException”:语法错误或访问冲突:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行的“”附近使用的正确语法

这是我的密码:

 if($_SERVER['REQUEST_METHOD']=='POST'){

$name   = trim($_POST['name']);
$contact= trim($_POST['contact']);
$email  = trim($_POST['email']);

if(!empty($name) && !empty($contact) && !empty($email)){

    try {
        $conn = new PDO("mysql::host='localhost';dbname=majorproject;",'root','');
        //for error reporting and throwing exceptions
        $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);



        $stmt = $conn->prepare("insert into #_customerdata(customername,customercontact,customeremail) values(:name,:contact,:email)"); 

        $stmt->bindParam(':name',$name,PDO::PARAM_STR);
        $stmt->bindParam(':contact',$contact,PDO::PARAM_INT);
        $stmt->bindParam(':email',$email,PDO::PARAM_STR);

        if($stmt->execute()){
            header('location: ../customersignup.php?status=success');
        }
        else{
            header('location: ../customersignup.php?status=failed');
        }


    } catch (PDOException $e) {
        echo 'CONNECTION NOT ESTABLISHED '.$e;

    }





}

}

我已检查了代码,但找不到任何错误。。有任何解决此问题的建议吗???

如果还不起作用,请尝试解决此问题:

$conn = new PDO("mysql::host='localhost';dbname=majorproject;",'root','');
在“mysql”和“host”之间,您有“::”,但它应该是“:”

表名中的
#
符号
#u customerdata
应使用记号进行转义

insert into `#_customerdata`
阅读标识符限定符:

假设这确实是表的名称,并且
#
符号不表示数值

或者重命名它,但不包含MySQL会抱怨的任何字符

如果它仍然抱怨,那么您将别无选择,只能将其重命名为just
customerdata

如以下人士在评论中所述:

OP使用的是PDO,而不是不推荐使用的mysql_u函数,OP使用的是带有绑定占位符的prepared语句。就我个人而言,在这种情况下,我会使用
bindValue
而不是
bindParam

并删除此处的一个冒号
mysql::host

请参阅与PDO连接的手册:

手册中的示例:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
参考:

添加到文件的顶部,这将有助于查找错误

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

这个磅符号
#_customerdata
就是问题所在。用记号把它包起来,
或者不用记号重命名它。@Fred ii-:我想你的评论应该是答案。我想补充一个答案,但你已经提供了答案。但值得称赞的是。。。我不想结束这个问题。。。OP使用的是PDO,而不是不推荐使用的mysql_u函数,OP使用的是带有绑定占位符的prepared语句。就我个人而言,在这种情况下,我会使用
bindValue
而不是
bindParam
@斯宾塞7593已经完成并引用您的评论,干杯。不遵循命名规则的MySQL标识符(例如表名、列名)必须正确转义。MySQL中的标准模式是使用backtick字符。(如果
sql\u mode
包含ANSI\u引号,则双引号也可用于转义标识符。)允许使用下划线作为表名称的第一个字符,而不转义。(对于不属于常规模式的“work”、“extract”和“save”表,但在同一数据库中,我用下划线开始所有这些表的名称。这很好地将它们与常规模式表分开。)@spencer7593感谢您所做的一切。包括您的评论。我打算添加一个指向MySQL的标识符限定符URL的链接,我现在就这么做。编辑:补充。当你写一本书的时候,告诉我,我会买的。@spencer7593你知道了;-)
<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code