试图通过PHP表单更新mysql记录。需要帮忙?

时间:2011-10-17 19:32:57

标签: php mysql

我有用于更新mySQl行的表单。我完成了搜索检索脚本以查找记录。现在我需要更新它。

当我提交表单时,我得到一个确认,即part_no已更新,但它没有显示在数据库中。

我做错了什么?有没有人在我的脚本中看到任何错误?

谢谢。

埃里克

这是我的剧本:

<?PHP
session_start();
?>

<?php


$orig_time=$_POST['orig_time'];
$type=$_POST['type'];
$part_no=$_POST['part_no'];
$description=$_POST['description'];
$count=$_POST['count'];
$size=$_POST['size'];
$min=$_POST['min'];
$max=$_POST['max'];
$qty=$_POST['qty'];

if ($part_no == "") echo "! No identifier retrieved";
else
echo "Amending record $part_no";

$host="localhost";
$username="XXXXXX";
$password="XXXXXX";
$db_name="naturan8_hero";
$tbl_name="cartons_current";

mysql_connect("$host", "$username", "$password") or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

mysql_query("UPDATE cartons_current SET orig_time='$orig_time', type='$type',   
description='$description', count='$count', size='$size', min='$min', max='$max',  
qty='$qty', WHERE reference='$part_no'");

echo "<BR>$part_no was updated.<BR><BR>";
?>

2 个答案:

答案 0 :(得分:2)

您的查询中存在语法错误。此外,使用错误检查器查看失败的内容。并确保您确实有一个$part_no来标识要更新的正确行:

而且,请注意SQL注入!

$orig_time = mysql_real_escape_string($_POST['orig_time']);
// do the same for the other $_POST indexes before passing them to the query!
// if values are numeric, you can cast them to INT to make sure they are numbers
// e.g. $count = intval($_POST['count']);



mysql_query("UPDATE `cartons_current` 
          SET `orig_time` ='".$orig_time."', 
          `type` = '".$type."',
          `description` = '".$description."', 
          `count` = '".$count."', 
          `size` = '".$size."', 
          `min` ='".$min."', 
          `max` ='".$max."',
          `qty` ='".$qty."'   
          WHERE `reference` = '".$part_no."'") or trigger_error(mysql_error());

<强>更新

尝试拨打mysql_affected_rows()以查看您的操作结果。另外,考虑一下

  

使用UPDATE时,MySQL不会更新新值的列   与旧值相同。这就产生了这种可能性   mysql_affected_rows()实际上可能不等于行数   匹配,只有受字面意义影响的行数   查询。

答案 1 :(得分:0)

您的问题似乎源于SQL语句中的此错误:

, WHERE reference='$part_no'"

您应该a)在构建脚本之前使用测试数据在测试数据库上运行所有SQL语句,以及b)使用某种日志记录,在那里可以使用SQL错误(不会显示在每个人的页面上)可以查看它)。换句话说,摆脱连接和数据库选择函数调用期间的OR die()语句。

我建议使用PDO库进行数据库连接。它更加通用,允许您实现预准备语句,这比发送未转义数据甚至使用mysql_real_escape_string()之类的内容要好得多。

此外,您的脚本逻辑似乎取决于$ _POST ['part_no']值是否有效。确保在执行任何其他操作之前执行此操作。使用错误或重定向来杀死脚本。如果没有正确的数据,没有意义连接到数据库。

这是一个重新分配所有传入POST值的快速技巧,BTW:

foreach($_POST AS $k=>$v) {
  $$k = $v;
}

这实际上是在命名空间中创建一个与数组键同名的变量,例如: $_POST['part_no']变为$part_no。这消除了重新分配值的所有不必要的代码行。您还可以使用循环来执行任何数据验证或清理/转义,您无需手动完成所有操作。