[英]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執行此操作的安全方法。 准備好的語句將確保您沒有(最高)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 不會相互混合。
例如:
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.