用于将带有/不带可选输入的表单插入MySQL的逻辑

时间:2016-03-28 22:52:08

标签: php mysql mysqli

使用:Brackets Html编辑器,MySQL Workbench

简化,我有一个包含这些表的数据库

  1. (主表)人
    • idperson PK NN UN AI
    • * fk_job NN UN(外键引用idjob)
    • fn NN
    • ln NN
  2. 作业
    • idjob PK NN UN AI
    • jobname NN
  3. ADRESS
    • idadress PK NN UN AI
    • * fk_person NN UN(外键引用idperson)
    • adress NN
  4. 和这个表格。在表单中,需要填写一个地址,并选择填写第二个地址。

    <?php
    $con = new mysqli("localhost","user","password","database");
    if ($con->
    
    connect_error) {
        die('Error : ('. $con->connect_errno .') '. $con->connect_error .'');
        }
    
    $job_sql = "SELECT idtype, typename FROM type;";
    $job_data = $con->query($job_sql);
    
    //insert if(isset()) here
    
    $con->close();
    ?>
    <form method="post">
     <select name="typeSlc" required>
      <option disabled selected>_</option>
      <?php while($row = mysqli_fetch_array($job_data)) { ?>
      <option value="<?php echo $row['jobid'];?>"><?php echo $row['jobname'];?></option>
      <?php } ?>
     </select>
     <input name="fnTxt" required type="text">
     <input name="lnTxt" required type="text">
     <input name="adressTxt" required type="text">
     <input name="cityTxt" required type="text">
     <input name="opt_adressTxt" type="text">
     <input name="opt_cityTxt" type="text">
     <input name="submit" value="submit" type="submit">
    </form
    

    问题:

    我希望在'opt_adress'设置时向服务器发送一批带有一批查询的事务,而在不设置时则发送另一批事务,即:

    if(isset($_POST['submit'])) {
     if(isset($_POST['opt_adress'])) {
      $sql = sprintf  ("BEGIN;
                        INSERT INTO person (fk_job, fn, ln)
                            VALUES (%s, '%s', '%s');
                        SELECT LAST_INSERT_ID() INTO @id;
                        INSERT INTO adress (fk_person, adress)
                            VALUES (@id, '%s');
                        INSERT INTO adress (fk_person, adress, city)
                            VALUES (@id, '%s', '%s');
                        COMMIT;",
                        $con->real_escape_string($_POST['jobSlc']),
                        $con->real_escape_string($_POST['fnTxt']),
                        $con->real_escape_string($_POST['lnTxt']),
                        $con->real_escape_string($_POST['adressTxt']),
                        $con->real_escape_string($_POST['cityTxt']),
                        $con->real_escape_string($_POST['opt_adressTxt']),
                        $con->real_escape_string($_POST['opt_cityTxt']))
      ;
     } else {
      $sql = sprintf  ("BEGIN;
                        INSERT INTO person (fk_job, fn, ln)
                            VALUES (%s, '%s', '%s');
                        INSERT INTO adress (fk_person, adress, city)
                            VALUES (LAST_INSERT_ID(), '%s', '%s');
                        COMMIT;",
                        $con->real_escape_string($_POST['jobSlc']),
                        $con->real_escape_string($_POST['fnTxt']),
                        $con->real_escape_string($_POST['lnTxt']),
                        $con->real_escape_string($_POST['adressTxt']),
                        $con->real_escape_string($_POST['cityTxt']))
      ;
     }
     $con->query($sql);
     header("Location: samepage.php");
    

    当我尝试运行查询时,它不会进入数据库(我正在使用MySQL Workbench)。没有错误消息,但查询不成功。

    如果可选输入中存在现有值,我想在事务中插入批处理。这是正确的字符串吗?或者我可以使用更时尚的代码吗?

    此问题中的表单和数据库是我在现实中使用的简化版本。

    提前致谢,-burrdie

1 个答案:

答案 0 :(得分:0)

您必须了解查询与一批查询之间的区别。

由于您必须执行多个单独的查询,因此您还必须进行多次单独的query()调用。

所以改变你的代码

$con->query("BEGIN");
$con->query(sprintf ("INSERT INTO person (fk_job, fn, ln)...");
$con->query("SELECT LAST_INSERT_ID() INTO @id");
// ...so on

你将被设定。

此外,它还可以让您编写更时尚的代码,因为您可以在执行过程中添加条件,从而不会复制代码。