簡體   English   中英

無法使簡單的SQL插入工作

[英]Can't Get Simple SQL Insert to Work

<?php include_once("database.php");

?>
<?php include_once("header.php");

?>



<?php 
    if ($_POST['submit'] )
    {
        $food_name = $_POST['food_name'];
        $food_calories = $_POST['food_calories'];
        echo $food_name . $food_calories;

        if (!empty($food_name) && !empty($food_calories) ) 
        {
            $query = 'INSERT INTO foods VALUES(0, $food_name, $food_calories)';
            mysqli_query($con, $query) or die(mysqli_error($con));
            echo 'added';   
        } else {echo'fail';}

    } else {echo'fa2oo';}


?>

  <h1> Please Fill out Form Below to Enter a New Food </h1>
  <form action="addfood.php" method="post">
    <p>Name:</p>
    <input type="text" name="food_name"/>
    <p>Calories:</p>
    <input type="text" name="food_calories"/> </br>
    <input type="submit" value="submit" />
  </form>

<?php include_once("footer.php")?>

真的不明白為什么這個簡單的插入無法正常工作。 表單是自引用的。 表單沒有回顯任何內容,只是在我點擊“提交”按鈕時才重置。 數據庫連接沒有錯誤。

由於要插入字符串,因此需要用單引號( ' )括起來:

$query = "INSERT INTO foods VALUES(0, '$food_name', $food_calories)";

但是請注意,使用字符串操作構建SQL語句會使您的代碼容易受到SQL注入攻擊的攻擊。 使用預備語句可能會更好。

您的代碼中有一些錯誤:

1.缺少名稱屬性

您缺少提交按鈕的名稱屬性。 所以像這樣添加它:

<input type="submit" name="submit" value="submit" />
                   //^^^^^^^^^^^^^

2. Wong變量在empty()

您必須檢查$_POST變量是否為空! 否則,您將嘗試將一個未定義的變量分配給另一個變量。 因此,將第二個if語句更改為此:

 if (!empty($_POST['food_name']) && !empty($_POST['food_calories']) ) 
          //^^^^^^^^^^^^^^^^^^^            ^^^^^^^^^^^^^^^^^^^^^^^

並將賦值放在第二個if語句中。

$food_name = $_POST['food_name'];
$food_calories = $_POST['food_calories'];

3.引號錯誤+引號丟失

您必須使用雙引號將查詢中的變量解析為變量。 另外,由於它們是字符串,因此必須在它們周圍加上單引號,因此請將查詢更改為:

$query = "INSERT INTO foods VALUES(0, '$food_name', '$food_calories')";
       //^                            ^          ^  ^              ^

旁注:

在文件頂部添加error reporting ,以獲取有用的錯誤消息:

<?php
    ini_set("display_errors", 1);
    error_reporting(E_ALL);
?>

您可能還想使用預備語句更改為mysqli因為它們更加安全。

這是使用mysqli執行此操作的安全方法。 准備好的語句將確保您沒有(最高)SQL注入風險

編輯以包括連接:

$conn = new mysqli($host, $username, $password, $dbname);

如果您想查看錯誤,則需要告訴php給出錯誤。 這應該足夠了:

if  ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

這部分是如何進行查詢。 注意bind_param部分; 在這里,您可以確定變量將如何進入數據庫以及它們所需的數據類型,因此您無需記住實際查詢中要在引號中加上哪些項目。

$query = $conn->prepare("INSERT INTO foods VALUES(0, ?, ?)");
$query->bind_param("si",$food_name, $food_calories);
$query->execute();
$query->close();

如前所述, $food_name是一個字符串,因此您可以在bind_param使用s來指定它,並假設卡路里是整數,它們就以i

使用此方法的另一個不錯的功能是,您不再需要擔心轉義變量。 輸入項完全按照輸入內容輸入

如果您想詳細了解更多信息,總有一個可靠的來源: http : //php.net/manual/en/mysqli.quickstart.prepared-statements.php

如果您發現它太多了,這是一個很好的站點,可以逐步學習如何從頭開始使用准備好的語句(它還包括PDO但您可能會發現起初使用mysqli會更容易,而且仍然相當不錯)。 http://www.w3schools.com/php/php_mysql_prepared_statements.asp

玩得開心!

這里有些錯誤。

首先,由於您的提交按鈕不帶有“ submit”名稱屬性,因此該條件語句中的任何內容都不會發生。

if ($_POST['submit'] ){...}

但是,最好為此使用isset()

if (isset($_POST['submit'] )) {...}

將您的提交修改為:

<input type="submit" name="submit" value="submit" />
                     ^^^^^^^^^^^^^

然后,我們要處理字符串,因此請用引號將變量包裝在值中。

將查詢用雙引號括起來,將值用單引號括起來:

$query = "INSERT INTO foods VALUES (0, '$food_name', '$food_calories')";

旁注1:如果遇到困難,請使用將它們放入其中的實際列名。

即: INSERT INTO table (col1, col2, col3) VALUES ('$val1', '$val2', '$val3')

旁注2:確保列的0確實是一個int ,但是我不知道您為什么使用它。

如果該列是auto_increment,則在架構接受的情況下,將0替換為''或NULL。

現在,如果MySQL可能會抱怨任何字符,例如引號等,那么您將需要對數據進行轉義/清理。

假設有人在輸入中輸入了Tim's donuts
MySQL會將您的值轉換為'Tim's donuts' ,從而引發語法錯誤。

  • 例如,使用mysqli_real_escape_string()可以轉義撇號並將其​​表示為'Tim\\'s donuts'是有效的語句,因為已將其轉義。

  • 更好的是,使用准備好的語句,如下所述。


在當前狀態下,您的當前代碼可以進行SQL注入 使用預處理語句或將PDO與預處理語句結合 使用起來更加安全


錯誤報告添加到文件頂部,這將有助於發現錯誤。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:錯誤報告僅應在登台進行,而不應在生產過程中進行。


腳注:

鑒於我們不知道要連接哪個MySQL API,請注意,不同的API 不會相互混合。

例如:

  • 您無法使用PDO進行連接並無法通過mysqli_查詢
  • 您無法連接使用mysql_與查詢mysqli_
  • 等等等

從A到Z,您必須保持一致,這意味着從連接到查詢。


最后總結:

如Rizier123所述,最好使用:

if (
    !empty($_POST['food_name']) 
    && 
    !empty($_POST['food_calories']) 
)
  • 這是一個更好的解決方案。

您的問題(至少其中一個)可能是SQL語句本身。 根據此食物表中的列,您將需要指定要插入的列。 嘗試這個:

INSERT INTO foods (col1, col2, col3) VALUES (val1, val2, val3)

另外,如果val1應該是ID列,那么如果它是自動遞增的,則不能為它指定一個值... db將為您處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM