Php PDOException SQLSTATE[42000]:语法错误或访问冲突:1064
我正在尝试使用php通过注册表获取条目。但我得到了以下错误: 带有消息“SQLSTATE[42000]的异常“PDOException”:语法错误或访问冲突:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第1行的“”附近使用的正确语法 这是我的密码: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']);
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会抱怨的任何字符
如果它仍然抱怨,那么您将别无选择,只能将其重命名为justcustomerdata
如以下人士在评论中所述:
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