PHP连接SQL修改功能报错:未定义变量与PDO参数不匹配
PHP/HTML/SQL交互修改功能错误修复
错误1:未触发修改时的$row未定义警告
问题原因
仅当URL携带alterar参数(点击修改按钮)时,才会执行数据库查询并为$row赋值。页面初始加载或未触发修改操作时,$row变量未定义,直接在表单中调用$row['xxx']会触发未定义变量和数组偏移错误。
修复方案
方案1:初始化$row并使用空合并运算符
在修改查询的PHP代码前初始化$row为空数组,同时在输出表单值时用空合并运算符避免数组偏移错误:
<?php include "conn.php"; $row = []; // 初始化空数组 if(isset($_GET['alterar'])){ $id=$_GET['id']; $consu=$conn->prepare('SELECT * FROM `cadastro` WHERE `id_prod`= :pid;'); $consu->bindValue(':pid',$id); $consu->execute(); $row=$consu->fetch(); } ?> <!-- 表单字段修改示例 --> <input type="text" name="nome_prod" placeholder="Nome" value="<?php echo $row['nome_prod'] ?? '';?>"/><br/> <input type="text" name="setor_prod" placeholder="setor" value="<?php echo $row['setor_prod'] ?? '';?>"/><br/> <!-- 其余涉及$row的字段均按此格式修改 -->
方案2:条件渲染修改表单
将修改表单的HTML代码包裹在isset($_GET['alterar'])的判断逻辑内,仅触发修改时才渲染表单:
<?php include "conn.php"; if(isset($_GET['alterar'])){ $id=$_GET['id']; $consu=$conn->prepare('SELECT * FROM `cadastro` WHERE `id_prod`= :pid;'); $consu->bindValue(':pid',$id); $consu->execute(); $row=$consu->fetch(); ?> <form action="index.php" method="POST"> <input type="hidden" name="id" value="<?php echo $row['id_prod']; ?>"> <input type="text" name="nome_prod" placeholder="Nome" value="<?php echo $row['nome_prod'];?>"/><br/> <input type="text" name="setor_prod" placeholder="setor" value="<?php echo $row['setor_prod'];?>"/><br/> <input type="text" name="custo_prod" placeholder="preço de custo" value="<?php echo $row['custo_prod'];?>"/><br/> <input type="text" name="venda_prod" placeholder="preco de venda" value="<?php echo $row['venda_prod'];?>"/><br/> <input type="text" name="estoque_prod" placeholder="estoque" value="<?php echo $row['estoque_prod'];?>"/><br/> <br/> <input type="submit" name="altera" value="Alterar"/> </form> <?php } ?>
错误2:PDO参数不匹配致命错误
问题原因
- UPDATE语句中使用了
:pid参数,但未通过bindValue绑定对应的$id值 - SQL语句的
SET子句末尾多了分号,导致语法异常 - 参数绑定逻辑错误:
:pvenda绑定了成本价变量,:pcusto绑定了售价变量,两者完全颠倒
修复方案
修改UPDATE操作的代码如下:
if(isset($_POST['altera'])){ $id = $_POST['id']; // 获取隐藏字段传递的商品ID $nome=$_POST['nome_prod']; $op=$_POST['setor_prod']; $preco_de_custo=$_POST['custo_prod']; $preco_de_venda=$_POST['venda_prod']; $estoque=$_POST['estoque_prod']; $situacao_do_produto=1; // 移除SET子句末尾的分号,修正参数对应关系 $altera=$conn->prepare(' UPDATE `cadastro` SET `nome_prod` = :pnome, `setor_prod` = :pop, `venda_prod` = :pvenda, `custo_prod` = :pcusto, `estoque_prod` = :pestoque, `situacao_prod` = :psituacao WHERE `cadastro`.`id_prod` = :pid;'); $altera->bindValue(':pnome',$nome); $altera->bindValue(':pop',$op); $altera->bindValue(':pvenda',$preco_de_venda); // 绑定售价到对应参数 $altera->bindValue(':pcusto',$preco_de_custo); // 绑定成本价到对应参数 $altera->bindValue(':pestoque',$estoque); $altera->bindValue(':psituacao', $situacao_do_produto); $altera->bindValue(':pid', $id); // 绑定商品ID参数 $altera->execute(); echo "Cadastro alterado com sucesso!"; }
内容的提问来源于stack exchange,提问作者awaky
相关产品推荐
相关产品推荐

