PHP:SQLSTATE [42000]:语法错误或访问冲突:1064
Posted
技术标签:
【中文标题】PHP:SQLSTATE [42000]:语法错误或访问冲突:1064【英文标题】:PHP: SQLSTATE[42000]: Syntax error or access violation: 1064 【发布时间】:2017-10-08 15:15:35 【问题描述】:我知道有很多关于这个错误的问题,但是堆栈溢出、谷歌等的答案都没有帮助我解决我的问题。也许这里有人可以弄清楚,为什么这个错误不断发生。 我对 php 比较陌生,所以对于小型应用程序,我阅读了很多教程并将它们用于我的案例。
我尝试使用以下教程创建一个注册页面:http://www.codingcage.com/2015/11/ajax-registration-script-using-jquery-php.html
一切都完成后,我总是得到错误
SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法!
...当我提交注册时。所以我认为它必须在这部分代码中:
$qry = "SELECT * FROM geraeteuser WHERE `user_email` LIKE :email";
$stmt = $db_con->prepare($qry);
$stmt->execute(array(":email"=>$user_email));
我在这里和那里尝试了所有使用 backtips 的方法,但无论我做什么,它都不起作用。
完整代码如下所示(“geraetestatus”是表名):
<?php
require_once "dbconfig.php";
if($_POST)
$user_name = $_POST['user_name'];
$user_email = $_POST['user_email'];
$user_password = $_POST['password'];
$password = md5($user_password);
try
$qry = "SELECT * FROM geraeteuser WHERE `user_email` LIKE :email";
$stmt = $db_con->prepare($qry);
$stmt->execute(array(":email"=>$user_email));
$count = $stmt->rowCount();
if($count==0)
$stmt = $db_con->prepare("INSERT INTO `geraeteuser`(user_name,user_email,user_password) VALUES(:uname, :email, :pass");
$stmt->bindParam(":uname",$user_name);
$stmt->bindParam(":email",$user_email);
$stmt->bindParam(":pass",$password);
if($stmt->execute())
echo "registered";
else
echo "Query could not execute !";
else
echo "1"; // not available
catch(PDOException $e)
echo $e->getMessage();
?>
在包含的文件“dbconfig.php”中,有一个这样创建的pdo:
<?php
$db_host = ***;
$db_name = ***;
$db_user = ***;
$db_pass = ***;
try
$dsn = "mysql:host=$db_host;dbname=$db_name";
$db_con = new PDO($dsn, $db_user, $db_pass, array(PDO::ATTR_PERSISTENT => true));
$db_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
catch(PDOException $e)
echo $e->getMessage();
?>
有没有人对我提出任何建议来完成这项工作?我尝试了几乎所有可以在这里和谷歌答案中找到的东西,但没有任何帮助。
【问题讨论】:
哪个sql语句产生了错误? 对不起,我忘了提。我想,我填表提交的时候总会出现,所以一定是这个,我想$qry = "SELECT * FROM geraeteuser WHERE 'user_email' LIKE :email"; $stmt = $db_con->prepare($qry); $stmt->execute(array(":email"=>$user_email));
@SilvioHungsberg 您是否真的在查询中使用了单引号,或者仅仅是因为 SO cmets 的格式也使用了反引号?你怎么知道它是 SELECT 查询,而不是 INSERT 查询?
这是因为格式化。现在我编辑了startpost。谢谢你到目前为止。我不确切知道错误发生在哪里。这只是一个猜测。你能给我一些建议吗,我怎么能弄清楚呢?
就像我上面问的那样,你怎么确定是 SELECT 查询产生了这个错误,而不是 INSERT 呢?您需要首先弄清楚这一点,例如,您可以通过将每个查询包装在其自己的 try/catch 块中来做到这一点,然后打印它是哪个查询。另外,能否展示一下AJAX调用的相关代码?
【参考方案1】:
在您的插入查询字符串的末尾缺少一个右括号。 你需要关闭 VALUES( ... --> )
【讨论】:
已经像上面发布的那样弄清楚了,但非常感谢您的帮助:)以上是关于PHP:SQLSTATE [42000]:语法错误或访问冲突:1064的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 — PHP — PDO [重复]
PHP 致命错误:未捕获的 PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误
致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO
SQLSTATE [42000]:语法错误或访问冲突:sql select 语句中的 1064