You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注入风险,就算修复了输出问题,也可以被恶意构造参数拖库、删全表。
修复方案

按以下步骤修改对应文件即可:

  1. 修正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();
    }
}
?>
  1. 修正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`");
?>
  1. 修正列表中删除按钮的超链接,补全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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:45:38