1

これをデータベースに挿入する際に問題が発生しました。prdocutPrice文字列またはストック文字列を10進数とintの値に変換しようとすると思います。私は残りを正しくやっているとかなり確信しています誰かが私のために確認できますか?

<?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文字列を変数に格納する代わりに2回呼び出しています$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ステートメントの問題をデバッグするのに役立ちます。

最後に、もう1つ追加します。呼び出し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')");

ただし、パラメータ化されたクエリを使用するには、 mysqliPDOmysql_real_escape_stringなどを使用して変数をエスケープするか、それらに切り替える必要もあります。

于 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($ 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 に答える