当我尝试将我的 prdocutPrice 字符串或股票字符串转换为十进制和整数值时,我想在将其插入我的数据库中时遇到问题。我很确定我正在做剩下的事情,有人可以为我确认吗?
<?php
if (isset($_POST['addSubmitted'])) {
$errors = array();
require_once ('mysql_connect.php');
//This gets all the other information from the form
$name=$_POST['productName'];
$description=$_POST['productDescription'];
$price= floatval($_POST['productPrice']);
$stock= intval($_POST['productStock']);
if (empty($errors)) {
//Writes the information to the database
mysql_query("INSERT INTO products (name, description, price, stock) VALUES ($name, $description, $price, $stock)");
$result = mysql_query($query);
if (mysql_affected_rows() == 1) {
// Show thank you message
echo '<span style="color:green;">Your product has been added.</span>';
} else {
echo '<font color="red">We were unable to add your product to the database.</font>';
}
} else {
echo '<font color="red"><h3>Error!</h3>
The following error(s) occured:<br /></font>';
foreach ($errors as $msg) {
echo " - <font color='"red'">$msg</font><br />'n";
}
}
}
?>
INSERT
语句中没有正确引用任何字符串值。用单引号将它们括起来。
另外,第一件事是 - 确保对所有字符串输入值调用mysql_real_escape_string()
,因为它们当前容易受到SQL注入攻击。
$name = mysql_real_escape_string($_POST['productName']);
$description= mysql_real_escape_string($_POST['productDescription']);
$price= floatval($_POST['productPrice']);
$stock= intval($_POST['productStock']);
此外,您调用mysql_query()
两次,而不是将 SQL 字符串存储到变量$query
中。
// Quote the string values,
// store the SQL as a variable then pass it to mysql_query()
$query = "INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', $price, $stock)";
$result = mysql_query($query);
调用 echo mysql_error();
将有助于调试 SQL 语句的问题。
最后,我要补充一点 - 除了对从$_POST
传递的字符串调用intval()
或floatval()
之外,验证数字是否确实是数字通常是一个好主意。 否则,如果它们是非数值,它们将被强制转换为 0,并且当您可能根本不应该插入它时,您将在数据库中得到零(因为它是无效数据)。
if (is_numeric($_POST['productPrice'])) {
$price = floatval($_POST['productPrice']);
}
else // non numeric value, don't do the insert with bad data
对于正整数或零整数,我喜欢使用ctype_digit()
:
if (ctype_digit($_POST['productStock'])) {
$stock = intval($_POST['productStock']);
}
else // bad input value, don't do insert
要回答您的问题,我相信您需要在值(尤其是字符串)周围加上引号:
mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', '$price', '$stock')");
但是您还需要使用 mysql_real_escape_string
转义变量,或者切换到 mysqli 或 PDO 之类的东西来使用参数化查询。
1)你容易受到SQL注入的影响。通读 http://bobby-tables.com,然后再继续使用任何代码
2)您在查询中忽略了引号,导致语法错误。您也没有处理任何错误,并假设您的查询成功:
mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', etc....)
^ ^
请注意其他引号。至于错误处理,您应该始终使用的绝对最低限度是
$result = mysql_query(...) or die(mysql_error());
即使您的查询字符串绝对有效(而您的查询字符串绝对不是),查询失败的原因也太多了,无法检查成功/失败。
empty($errors)) { 将信息写入数据库 mysql_query("插入产品(名称、描述、价格、库存)值($name、$description、$price、$stock)"); $result = mysql_query($query);
这不应该是:
if (空($errors)) { 将信息写入数据库 $query="插入产品(名称,描述,价格,库存)值($name,$description,$price,$stock"; $result = mysql_query($query);
mysql_query("插入产品(名称、描述、价格、库存)值($name、$description、$price、$stock)");
您没有为mysql_query声明变量。此外,Michael 在转义字符串值方面也有一些优点。尝试使用$query变量和值两边的单引号执行此操作。
$query = mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', '$price', '$stock')");