0

这里有点奇怪的问题......

我有一个无法正常工作的更新查询,而且我一生都无法找出原因!

我的表有两个三个字段-'id'(整数,自动增量)、'date'(日期)和'amountraised'(十进制)。我正在开发的应用程序的一部分计算慈善书摊每周的筹款总额。“日期”字段使用日期列类型,就像网站上的其他地方一样,我在计算中使用日期。

在系统的其他地方,我还有其他运行良好的更新查询,但我怀疑这个问题的问题在于,除了更新记录之外,我还试图操纵日期格式(这样我就可以输入英国 dd-mm-yyyy 格式的日期,然后使用 PHP 转换回 MySQL 友好的 yyyy-mm-dd 格式。

这是奇怪的一点。根据网站上的确认页面,查询运行正常,并且进行了更新,但是当我检查数据库时,没有任何改变。所以我可以检查查询的输出是什么我已经尝试将结果回显到网页以查看我得到了什么。预期值显示在页面上,但同样,当我检查数据库时,没有任何更新。

这是我的带有日期转换功能的更新表格:

          function dateconvert($date,$func) {
          if ($func == 1){ //insert conversion
          list($day, $month, $year) = split('[/.-]', $date); 
          $date = "$year-$month-$day"; 
          return $date;
          }
          if ($func == 2){ //output conversion
          list($year, $month, $day) = split('[-.]', $date); 
          $date = "$day/$month/$year"; 
          return $date;
            }
          } // end function      
          require_once('/home/thebooks/admins/connect.php');
          $id = $_GET['id'];
          $dateinput = $_GET['dateinput'];
          $query = "SELECT * FROM fundraisingtotal WHERE id='$id'";
          $result = mysql_query($query);
          $row = mysql_fetch_array($result);
          extract($row);
          $date = $row['date']; //your mysql date
          $realdate = dateconvert($date,2); // convert date to British date
          $amountraised = stripslashes($amountraised); //amount raised
          mysql_close();?>
            <div id="title">Update Fundraising Total</div>
            <form id="updatetotals" action="updated.php" method="post">
                <div class="row"><label for="dateinput" class="col1">Date&nbsp;&nbsp;</label><span class="col2"><input id="dateinput" name="dateinput" type="text" size="25" value="<?php echo $realdate ?>" maxlength="10" /></span></div>
                <div class="row"><label for="amountraised" class="col1">Fundraising Total&nbsp;&nbsp;</label><span class="col2"><input id="amountraised" name="amountraised" type="text" size="25" value="<?php echo $amountraised ?>" maxlength="7" /></span></div>
                <div class="submit"><input type="submit" name="submitted" value="Update" /><input type="reset" name="reset" value="Clear the form" /></div>
                <input type="hidden" name="id" value="<?php echo $id ?>" />
            </form>

...这是表单处理/查询页面:

    require_once('/home/thebooks/admins/connect.php');
    $dateinput = $_POST['dateinput'];

    // Date conversion from: http://www.phpbuilder.com/annotate/message.php3?id=1031006
    // using type 1
    $convdate = $_POST['dateinput']; // get the data from the form
    $convdate = dateconvert($convdate, 1); // Would convert to e.g. 2005-12-19 which is the format stored by mysql

    function dateconvert($convdate,$func) {
    if ($func == 1){ //insert conversion
    list($day, $month, $year) = split('[/.-]', $convdate); 
    $date = "$year-$month-$day"; 
    return $date;
    }
    if ($func == 2){ //output conversion
    list($year, $month, $day) = split('[-.]', $convdate); 
    $date = "$day/$month/$year"; 
    return $date;
      }
    }
    $date = "$convdate";
    $amountraised = $_POST['amountraised'];         

    $update = "UPDATE fundraisingtotal SET date = '$date', amountraised = '$amountraised' WHERE id='$id' ";
    $result = mysql_query($update);
    $realdate = dateconvert($date,2); // convert date to British date 
    if ($result) {
    echo "<p class=\"dbpara\">Thank you. Your update to the record was successful.</p>";
    echo "<p class=\"dbpara\">The record has been amended to a date of <b>$realdate</b> and amount of <b>$amountraised</b>.</p>";
    }
    else {
    echo "<p>Nothing has been changed.</p>";
    }
    mysql_close();

奇怪的是,确认文本“记录已被修改为……等等”。显示完全符合预期,但是当我检查数据库时,记录根本没有更新。

我确定这一定是我弄乱了日期格式而遗漏了一些东西,或者我的顺序有误,但是我已经尝试了很多不同的变体,现在我看不到木头了树木。有人知道我在这里做错了什么吗?

4

4 回答 4

3

我在这里看到了一些危险信号。您正在从表单中获取日期并将其输入 MySQL,而无需任何形式的验证——这可能会导致 SQL-injections

首先将dateconvert功能更改为更安全的东西。即使用户试图滥用系统,此函数也将始终返回正确的格式化日期。

编辑 1:忘记放一个:aftercase 'en_en'但现在修复它。谢谢霓虹蓝。
编辑 2:忘记为date()函数提供时间戳。固定的!
编辑 3:将前斜杠转换为破折号的 preg_replace

// this function always returns a valid date
function dateconvert($date = NULL, $date_type = 'sql') {
        $date = preg_replace("/", "-", $date);
    $timestamp = strtotime($date);
    switch($date_type) {
        default: case 'sql' : return date('Y-m-d', $timestamp); break; // prints YYYY-MM-DD
        case 'en_EN' : return date('d-m-Y', $timestamp); break; // prints DD-MM-YYYY
    }
}

您可以随时查看Zend_Date可以让您使用自己的格式的日期。

于 2009-11-12T18:17:11.587 回答
2

改变

$result = mysql_query($update);

$result = mysql_query($update) or die(mysql_error());

当查询失败时,您应该会看到问题所在。

于 2009-11-12T18:03:54.490 回答
1

我会寻找三件事:

  1. 代码是否附加到您正在查看的同一数据库?(我在这个上花了几个小时;)

  2. 之后是否会立即运行另一个更新语句(或此语句)来更改值?在这里,您需要一些日志记录才能弄清楚。

  3. 如果回显sql,直接自己运行会发生什么?

于 2009-11-12T18:22:06.227 回答
1

如果您看到该表没有更改任何值但查询没有显示任何错误,则WHERE id = '$id'没有达到您想要的寄存器。

不要忘记像其他人告诉您的那样清理您的查询。

于 2009-11-12T19:55:36.120 回答