提交一个或另一个查询

时间:2011-09-27 18:46:52

标签: php mysql

我继续抨击我的新手php / mySQL'Invoicer'应用程序。

我现在有一个表单页面,我想在其中运行两个查询之一 - INSERT或UPDATE,具体取决于是否存在ID。在场的时候 ID用于检索记录并相应地预先填充表单,我已经工作了。我现在的问题是我的条件位是 显然不对,因为在任何一种情况下,提交表单时都会运行INSERT查询,无法运行UPDATE,而且我已经筋疲力尽了 理解(和猜测)。

我很想知道为什么这不起作用,即使它不是最好的方法,我绝对愿意将查询移到process.php, 我也想知道我是否应该使用'if(isset($ _ GET ['ID'])'来简单地包含一个块或另一个块。

非常感谢您提供任何帮助或建议。 (p.s.我的意图是,一旦我接通了广泛的笔画,就要彻底检查最佳实践/安全性)

欢呼,s

<?php

    // CASE I: 'EDIT RECORD':
    //  If there's an ID ...
    if  (isset($_GET['ID']) && is_numeric($_GET['ID'])) {
        $id = $_GET['ID'];
        echo "<p class=\"status\"><strong>ID IS SET ... ergo we're editing/UPDATING an existing record</strong></p>";

        //  ... retrieve the record ....
        $query = sprintf("SELECT * FROM Invoices WHERE ID = %s", $id);
        $result = mysql_query($query) or die(mysql_error());
        $row = mysql_fetch_array($result);

        //  ... assign variables to pre-populate the form
        $id         = $row['ID'];
        $invNumber  = $row['invNumber'];
        $invDate        = $row['invDate'];
        // [ snip: more variables > field data ]

        // on submit: get the form values ...
        // no worky: if (isset($_GET['ID']) && isset($_POST['submit'])) {
        if  (isset($_POST['submit']))   {
            $invNumber  = $_POST['invoice-number'];
            $invDate        = $_POST['invoice-date'];
            $projNumber = $_POST['project-number'];
            // [ snip: more variables > field data ]


            // ... and UPDATE the db:
            $qUpdate = "UPDATE Invoices SET invNumber='$invNumber', invDate='$invDate', projNumber='$projNumber', client='$client', task='$task', issueDate='$issueDate', subTotal='$subTotal', tax='$tax', invTotal='$invTotal', datePaid1='$datePaid1', datePaid2='$datePaid2', comments='$comments' WHERE ID='3'";
            $result = mysql_query($qUpdate) or die(mysql_error());
            if($result) {
                echo "<p class=\"status\"><strong>SUCCESS: RECORD UPDATED!</strong></p>";
            }
            else die("DAMMIT JIM I'M A DOCTOR NOT A DB ADMIN!" . mysql_error());

        } // CLOSE '(isset($_POST['submit']))
    } // END CASE I: ID present


    // CASE II: 'NEW RECORD'; query = INSERT
    elseif (empty($_GET['ID'])) {
        echo "<p class=\"status\"><strong>No ID ... ergo we're INSERTING a new record:</strong></p>";

        // on submit: get the form values ...
        if (isset($_POST['submit']))    {
            $invNumber  = $_POST['invoice-number'];
            $invDate        = $_POST['invoice-date'];
            $projNumber = $_POST['project-number'];
            // [ snip: more variables > field data ]

            $qInsert =  "INSERT INTO Invoices (invNumber,invDate,projNumber,client,task,issueDate,subTotal,tax,invTotal,datePaid1,datePaid2,comments)
                VALUES('$invNumber','$invDate','$projNumber','$client','$task','$issueDate','$subTotal','$tax','$invTotal','$datePaid1','$datePaid2','$comments')";
            $result = mysql_query($qInsert) or die(mysql_error());
            if($result) {
                echo "<p class=\"status\"><strong>SUCCESS: NEW RECORD INSERTED!</strong></p>";
            }
            else die("DAMMIT JIM I'M A DOCTOR NOT A DB ADMIN!" . mysql_error());
        } // CLOSE '(isset($_POST['submit']))
    } // END CASE II: No ID present

?>

<form id="invoiceData" method="post" action="/html/form.php">       

2 个答案:

答案 0 :(得分:1)

当您提交表单时,您需要再次包含该ID,否则它将被静默删除,因为您要发布到硬编码值/html/form.php(已删除ID)。这将导致empty($_GET['ID'])部分匹配并运行,从而导致INSERT。您可以简单地将ID值包含在每个表单帖子的操作中,如下所示:

<form
  id="invoiceData"
  method="post"
  action="/html/form.php?ID=<?php echo $_GET['ID']; ?>"
>

这应该适用于UPDATE和INSERT的情况,因为如果没有ID开头,这将呈现为/html/form.php?ID=,这将与ID为empty的情况相匹配, 我相信。您可能希望确定测试此逻辑。

希望这有帮助!

答案 1 :(得分:1)

如果您将其作为URL参数传递,则会设置

$_GET[ID]。因此,如果您将<form>操作更改为

<form id="invoiceData" method="post" action="/html/form.php?ID=12">

如果12是您想要的任何ID,您应该得到您想要的结果 - 只要您的表单中也有<input type="hidden" name="submit" value="1" />(值可以是任何值)。