【问题标题】:Sending form before submit using PHP在使用 PHP 提交之前发送表单
【发布时间】:2015-02-20 01:20:05
【问题描述】:

当我在 localhost (XAMPP) 中运行该 php 时,我在按下提交按钮“bilgiler sisteme gönderilemedi”之前直接收到该错误消息

所以我无法将信息发送到我的数据库中。

<body>

<form  action="insert_pro.php" method="post" enctype="multipart/form-data">
    <div class="center_content">
      <div class="title_box">Insert New Product</div>
      <div class="prod_box_big">
        <div class="center_prod_box_big">
          <div class="product_img_big"> <!-- <a href="javascript:popImage('images/big_pic.jpg','Some Title')" title="header=[Zoom] body=[&nbsp;] fade=[on]"><img src="images/p3.jpg" alt="" border="0" /></a> -->

          </div>
          <div class="details_big_box">


          <!-- TITLE -->
            <div class="product_title_big" >Product Title :</div>
            <td><input type="text" name="title" required/></td>

            <!-- DESCRİPTİON -->
            <div class="product_title_big">Description : </div>
            <td><textarea name="descrip" cols="21" rows="5"/></textarea></td>

            <!-- PRICE -->
            <div class="product_title_big">Price :</div>
            <td><input type="text" name="price" required/></td>

            <!-- PHOTO -->
            <div class="product_title_big">Product Photo :</div>
            <td><input type="file" name="way" required/></td>

            <!-- NOTE -->
            <h1>IF YOU FINISHED FILLING INFORMATION OF THE PRODUCT CLICK ADD PRODUCT</h1>
            </div>

            <!-- BUTTON -->
            <input   type="submit" name="insert_post" value="ADD PRODUCT">

        </div>
      </div>
    </div>

</form>


</body>
</html>


<?php
$title=$_POST['title'];
$descrip=$_POST['descrip'];
$price=$_POST['price'];

if($price){//veri geldi ise sisteme giriyoruz
    //mysqle bağlanıyoruz
$ServerAd="localhost";//server ismini girin localde kurduysanız localhost girin.
$KAd="root";//kullanıcı adı
$KSifre="3306505";//kullanıcı şifresi
$VeriAd="shop";//veritabanı adı
$db=@mysql_connect($ServerAd,$KAd,$KSifre) or die(@mysql_err());//veri tabanına bağlanılıyor
$sec=@mysql_select_db($VeriAd);//veri tabanı seçiliyor
$ekle=mysql_query("insert into product (title,descrip,price) values ($title,$descrip,$price)");//veri tabanına veri giriliyor.
if($ekle)//veri girişi başarılı ise
echo "Sayın Yorumunuz sistemimize iletilmiştir.Teşekkürler";
else//veri girişi hatalı ise
echo "bilgiler sisteme gönderilemedi";
} ?>

【问题讨论】:

  • (有关信息 - 根据 Google 翻译,“bilgiler sisteme gönderilemedi”仅表示“信息未发送到系统”)
  • ($title,$descrip,$price) 在传递字符串值时需要引用。将or die(mysql_error())添加到mysql_query(),你会看到MySQL抛出的错误。
  • 您的查询中有语法错误,因为您没有将变量包装在撇号中。这是另一个问题,OP 没有正确检查返回状态,因此不知道发生了什么。
  • 您在此代码中存在 SQL 注入漏洞,最好迁移到更新的数据库库并使用查询参数化。一般来说,最好避免使用@ 错误抑制运算符,因为这可能会隐藏问题。

标签: php html mysql forms


【解决方案1】:

您需要引用字符串值。但是,您对SQL injection 持开放态度,所以我使用mysqli 和准备好的语句编造了一些东西。

旁注:将or die(mysql_error()) 添加到mysql_query() 会表示语法错误。

<?php 
$link = new mysqli('localhost', 'root', 'password', 'db');
if ($link->connect_errno) {
    throw new Exception($link->connect_error, $link->connect_errno);
}

// Check that the expected value has been provided via a POST request
if (isset($_POST['insert_post'])) {


// now prepare an INSERT statement
if (!$stmt = $link->prepare('insert into product (title,descrip,price) VALUES (?,?,?)')) {
    throw new Exception($link->error, $link->errno);
}

// bind parameters
$stmt->bind_param('sss', $_POST['title'], $_POST['descrip'], $_POST['price']);

if (!$stmt->execute()) {
    throw new Exception($stmt->error, $stmt->errno);
    }

} // brace for (isset($_POST['insert_post']))

有关准备好的语句的更多信息:

咨询the manual on mysqli with prepared statements,或PDO with prepared statements


注意:

如果您仍然热衷于保留现有的 MySQL API,请将其更改为:

VALUES ('".$title."','".$descrip."','".$price."')

并使用**stripslashes() mysql_real_escape_string()。

即:

$title = stripslashes($_POST['title']);
$title = mysql_real_escape_string($_POST['title']);

并为其他人做同样的事情。

**旁注:我使用stripslashes() 的原因是能够在名称中添加撇号,例如 O'Neil。而不是它在 DB 中显示为 O\'Neil。

它 (stripslashes()) 与防止 SQL 注入无关,它只是一个附加选项。 mysql_real_escape_string() 有助于防止注入,但是真正应该使用准备好的语句;无论是使用mysqli_ 还是 PDO API。

引用Halfer:

据我所知,如果 magic quotes 自动转义了包含撇号的名称,您只需要在包含撇号的名称上使用 stripslashes()。由于这在 PHP 中不再可用,我将不再添加此类代码。 mysql_real_escape_string() 等转义函数将自行处理“O'Neil”。

【讨论】:

  • stripslashes 不会走错路来防止 SQL 注入吗? Afaict 它将采用反斜杠字符串并删除斜杠,而实际上我们想要添加它们。
  • @halfer 你是对的,但是为什么我总是使用stripslashes()(或在我的答案中添加它)是能够在名称中添加撇号,例如 O'Neil。而不是它在 DB 中显示为 O\'Neil。 mysql_real_escape_string() 接管注入。然而,准备好的陈述是更好的方法。如果我对此有误,请纠正我,但这是我自己处理撇号的经验,干杯(我将对此进行编辑)。
  • 据我所知,如果magic quotes 自动转义了包含撇号的名称,您只需要在包含撇号的名称上使用stripslashes。由于这在 PHP 中不再可用,我将不再添加此类代码。 mysql_real_escape_string() 等转义函数将自行处理“O'Neil”。
  • @halfer 这是一个很好的观点。我在编辑中添加了这一点,引用了你的话。感谢您提供这些信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2012-04-27
相关资源
最近更新 更多