将项目插入数据库


Insert item into database

当我尝试将我的 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());

即使您的查询字符串绝对有效(而您的查询字符串绝对不是),查询失败的原因也太多了,无法检查成功/失败。

if (

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')");