1

当我尝试将我的 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";
            }
        }
    }

?> 
4

5 回答 5

5

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

调用 toecho mysql_error();将有助于调试您的 SQL 语句的问题。

最后,我还要补充一点——除了调用intval()floatval()传递的字符串之外$_POST,验证数字实际上是数字通常是一个好主意。否则,如果它们是非数值,它们将被强制转换为 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
于 2012-04-28T16:25:24.733 回答
1

要回答您的问题,我相信您需要在值周围加上引号(尤其是字符串):

mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', '$price', '$stock')");

但是您还需要使用 mysqli 或 PDO 来转义变量mysql_real_escape_string或切换到类似mysqliPDO的东西以使用参数化查询。

于 2012-04-28T16:26:52.920 回答
1

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());

即使您的查询字符串绝对完全有效(而您的绝对不是),也有太多其他原因导致查询失败而不检查成功/失败。

于 2012-04-28T16:27:15.330 回答
0

if (empty($errors)) { //将信息写入数据库 mysql_query("INSERT INTO products (name, description, price, stock) VALUES ($name, $description, $price, $stock)"); $result = mysql_query($query);

这不应该是:

if (empty($errors)) { //将信息写入数据库 $query= "INSERT INTO products (name, description, price, stock) VALUES ($name, $description, $price, $stock"; $result = mysql_query($查询);

于 2012-04-28T16:30:24.250 回答
0

mysql_query("INSERT INTO products (name, description, price, stock) VALUES ($name, $description, $price, $stock)");

您没有为 mysql_query 声明变量。此外,Michael 对转义字符串值有一些好处。尝试使用$query变量和值周围的单引号。

$query = mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', '$price', '$stock')"); 
于 2012-04-28T16:31:05.680 回答