我有用于更新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>";
?>
答案 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
。这消除了重新分配值的所有不必要的代码行。您还可以使用循环来执行任何数据验证或清理/转义,您无需手动完成所有操作。