PHP PDO执行DELETE报SQLSTATE[42000] 1064语法错误求助
错误定位
报错的核心触发原因有2个,附带1个严重安全隐患:
- 删除按钮的超链接中,输出项目ID的PHP代码漏写
echo,导致$_GET['borrar']参数实际为空值。拼接后最终执行的SQL语句为DELETE FROM proyecto WHERE id =,ID位置无有效值,完全不符合SQL语法,触发1064语法错误,和报错提示的near '' at line 1完全匹配。 - 附带语法问题:
conexion.php开头的PHP标签写法错误,原代码写为?php,缺少开头的<,会导致PHP代码无法被解析、直接输出到页面。 - 安全隐患:现有代码直接把GET参数拼接到SQL语句中,存在SQL注入风险,就算修复了输出问题,也可以被恶意构造参数拖库、删全表。
修复方案
按以下步骤修改对应文件即可:
- 修正
conexion.php,补全正确的PHP开标签,改造数据库操作方法支持PDO预处理,从根源避免SQL注入,完整代码如下:
<?php class conexion{ private $servidor = "localhost"; private $usuario = "root"; private $password = ""; private $conexion; public function __construct(){ try{ $this->conexion = new PDO("mysql:host=$this->servidor;dbname=proyectos",$this->usuario,$this->password); $this->conexion->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ die("数据库连接失败:".$e->getMessage()); } } // 支持预处理传参 public function ejecutar($sql, $params = []){ $sentencia = $this->conexion->prepare($sql); $sentencia->execute($params); return $this->conexion->lastInsertId(); } public function consultar($sql, $params = []){ $sentencia = $this->conexion->prepare($sql); $sentencia->execute($params); return $sentencia->fetchAll(); } } ?>
- 修正
galeria.php的删除逻辑,增加参数合法性校验,使用预处理传参执行删除,删除完成后重定向避免重复提交,代码如下:
<?php require 'conexion.php'; $obj_conexion = new conexion(); // 处理删除请求 if(isset($_GET['borrar'])){ $id = intval($_GET['borrar']); // 强制转为整数,过滤非法输入 if($id > 0){ $sql = "DELETE FROM proyecto WHERE id = ?"; $obj_conexion->ejecutar($sql, [$id]); } // 重定向回列表页,避免刷新重复提交 header("Location: galeria.php"); exit; } $proyectos = $obj_conexion->consultar("SELECT * FROM `proyecto`"); ?>
- 修正列表中删除按钮的超链接,补全
echo输出项目ID,去掉参数前后的多余空格,对应代码片段如下:
<tbody> <?php foreach($proyectos as $proyecto){ ?> <tr> <td><?php echo $proyecto['id']; ?></td> <td><?php echo $proyecto['nombre']; ?></td> <td><?php echo $proyecto['imagen']; ?></td> <td><?php echo $proyecto['descripcion']; ?></td> <td> <a class="btn btn-danger" href="?borrar=<?php echo $proyecto['id']; ?>">Eliminar</a></td> </tr> <?php } ?> </tbody>
内容的提问来源于stack exchange,提问作者Josue Charls
相关产品推荐
相关产品推荐

