代码之家  ›  专栏  ›  技术社区  ›  jerneva

MYSQL-将多个输入插入表问题

  •  1
  • jerneva  · 技术社区  · 10 年前

    我一直在使用这个代码(更改变量名称),在我的网站上输入信息到我的数据库中,我从来没有遇到过问题。 这是我最想一次插入数据库的变量。没有数据无法插入的错误消息。

    有更好的方法吗?这是一个已知的问题吗?

    PHP公司

    <?php
    if (isset($_POST['Save'])) {
      $f_name = $_POST['franchise_name'];
      $f_email = $_POST['fran_email'];
      $f_mangn = $_POST['mang_name'];
      $f_addline_1 = $_POST['franc_address'];
      $f_addline_2 = $_POST['address2'];
      $f_city = $_POST['city'];
      $f_pcode = $_POST['pcode'];
      $f_phone = $_POST['franc_phone'];
    
      $insert_franc_dets = "INSERT INTO Franchise_manager_account(Area_Name,Franchise_email,Fran_Fname,Fran_business_add_line1,Fran_business_add_line2,Fran_City,fran_Postcode,Fran_Contact_Num) 
      VALUES (?,?,?,?,?,?,?,?)
      ON DUPLICATE KEY 
      UPDATE
      Area_Name = '$f_name',
      Franchise_email = '$f_email',
      Fran_Fname = '$f_mangn',
      Fran_business_add_line1 = '$f_addline_1',
      Fran_business_add_line2 = '$f_addline_2',
      Fran_City = '$f_city',
      fran_Postcode = '$f_pcode',
      Fran_Contact_Num = '$f_phone'";
    
      $c = mysqli_prepare($dbc, $insert_franc_dets);
      //new
      // $stmt = mysqli_prepare($dbc, $insert_c);
      //debugging
      //$c = mysqli_prepare($dbc, $insert_franc_dets)  or die(mysqli_error($dbc));
    
      mysqli_stmt_bind_param($c,'sssssssi', $f_name, $f_email, $f_mangn, $f_addline_1, $f_addline_2, $f_city, $f_pcode, $f_phone);
    
      /* execute query */
      $execute = mysqli_stmt_execute($c);
    
      // if inserted echo the following messges
      if ($execute) {
        echo "<script> alert('Addrrss Saved')</script>";
      } else {
        echo "<b>Oops! we have an issue </b>";
      }
    }
    $dbc->close();
    ?>
    

    HTML格式

    <form id="franchiseDets" action ="Franchise-Details.php" method="POST">
    
    
      <!--                franchise details form-->
      <div class="field">
    
          <input type="text" name="franchise_name" id="fran_name" placeholder="e.g One Delivery Leeds" pattern="[a-zA-Z]" 
                 autofocus required tabindex="1">
          <br>
    
          <input type="email" name="fran_email" id="fran_email" placeholder="leeds@one-delivery.co.uk" required tabindex="2">
          <br>
    
          <input type="text" name="mang_name" id="name" placeholder="Joe Blogs" required tabindex="3">
          <br>
    
    
          <input type="text" name="franc_address" id="address1" placeholder="Address Line 1" tanindex="4">
          <input type="text" name="address2" id="address2" placeholder="Address Line 2" tabindex="5">
          <input type="text" name="city" id="city" placeholder="Town/City" tabindex="6">
          <input type="text" name="pcode" id="pcode" placeholder="Postcode" tabindex="7">
          <br>
    
    
          <input type="tel" name="franc_phone" id="phone" placeholder="Customer service number" min="10" maxlength="11" pattern="[0-9]{3}[-][0-9]{4}[-][0-9]{4}" 
                 required title="Please provide your customer service number in the following format: 000-0000-0000" tabindex="8">
    
    <input type="submit" name="Save" value="Save">
    </form>
          <br>
      </div>
    

    表(3个独特元素) 会话开始();位于页面顶部。 仍在进行sql注入。

    1 回复  |  直到 10 年前
        1
  •  2
  •   spencer7593    10 年前

    您正在为插入使用绑定占位符。(这是件好事)

    但你有 字面量 在更新的SQL文本中。(为了世界上所有美好事物的爱,你为什么要这样做?)

    带有绑定占位符的准备语句是对SQL注入的防御。但这项工作只完成了一半。

    只需使用 VALUES() 函数来引用本应插入到列中的值(如果插入有效)。我没有查看您要将哪些值分配给更新部分中的哪些列,下面的示例将分配为插入提供的值。

     INSERT INTO franchise_manager_account
          ( area_name
          , franchise_email
          , fran_fname
          , fran_business_add_line1
          , fran_business_add_line2
          , fran_city
          , fran_postcode
          , fran_contact_num
          ) VALUES
          ( ?
          , ?
          , ?
          , ?
          , ?
          , ?
          , ?
          , ?
          )
     ON DUPLICATE KEY 
     UPDATE area_name               = VALUES(area_name)
          , franchise_email         = VALUES(franchise_email)
          , fran_fname              = VALUES(fran_fname)
          , fran_business_add_line1 = VALUES(fran_business_add_line1)
          , fran_business_add_line2 = VALUES(fran_business_add_line2)
          , fran_city               = VALUES(fran_city)
          , fran_postcode           = VALUES(fran_postcode)
          , fran_contact_num        = VALUES(fran_contact_num)
    

    为了这个 UPDATE 部分执行时,INSERT必须引发“重复键异常”。要发生该错误,至少需要定义一个PRIMARY和/或UNIQUE KEY。(从哪个列或哪些列构成主键和/或唯一键的问题来看还不清楚 省略 来自UPDATE的那些列。)

    如果我需要提供 不同的 值,我会使用SQL表达式执行任何检查或操作(例如,不要替换非NULL值,或添加到现有值,等等)。

           , col7  = IF(col7 IS NULL, VALUES(col7), col7) 
           , col8  = col8 + VALUES(col8)
           , col9  = CONCAT(col9,',',VALUES(col9))
           , colA  = ?
    

    如果它是一个完全不同的值,那么我会给它提供一个绑定占位符,就像在INSERT中一样。

    至于为什么没有插入一行……如果是SQL注入导致了问题,比如其中一个值包含单引号或其他内容,那么上面的模式应该解决这个问题。

    代码应该真正检查来自 prepare 以及 execute ,并处理错误。发射 mysqli_error 文本不是生产就绪代码的最佳实践,但它易于开发和调试。至少,您的代码应该检查错误并具有代码块。对于开发,至少echo/print mysqli_error。

    如果你的代码没有这样做,那么它会把它的虚拟小指放在它的虚拟嘴角,邪恶博士的风格,并说“我只是假设一切都会按计划进行。什么?”

    并确保启用了PHP错误报告。

    你确定你的第一个脚本已经被执行了吗?

    如果仍然找不到问题,请开始添加其他调试输出。

    How to debug small programs