1

私はこのコードを持っています:

public function updateOrder($num, $ufood, $uquan) {
    $response = array();    

    mysql_query("SET NAMES 'utf8'");

    foreach ($ufood as $index => $f) {
        $result = mysql_query("SELECT food, quantity, uquantity FROM table1 WHERE food ='".$f."'") or die(mysql_error());  
        $no_of_rows = mysql_num_rows($result);

        $response['number rows'] = $no_of_rows;

        if ($no_of_rows>0) {
            while ($row = mysqli_fetch_array($result)); {
                if (!$row['uquantity']) {
                    $w = "INSERT INTO table1(uquantity) VALUES ('$uquan[$index]')";

                    mysql_query($w);
                    $e = (int)$row['quantity'];
                    $q = (int)$uquan[$index];
                    $sum = $e+$q;
                    $s = (string)$sum;
                    $d = "UPDATE table1 SET quantity = '$s' WHERE food = ".$row['$food']." ";
                    mysql_query($d);

                } else if($row['uquantity']) {
                    $c = (int)$row['uquantity'];
                    $q = (int)$uquan[$index];
                    $sumq = $c+$q;
                    $sq = (string)$sumq;
                    $d = "UPDATE table1 SET uquantity = '$sq' WHERE food = ".$row['$food']." ";
                }
            }
        } else {
            $string ="INSERT INTO table1(food,uquantity) VALUES ('".$f."','".$uquan[$index]."')";
            $z = mysql_query($string);      
        }
    }
}

まあ、私はこれを機能させることはできません。私はあらゆる種類のことを試していますが、それでも機能しません。だから私はいくつかの質問があります:

  • この構造はforeach有効whileですか?

  • クエリはデータベースからいくつ$resultかの行を返しますが$row['quantity']、 を値として使用しようとすると、 が得られnullます。

このコードでは、Android アプリからいくつかのデータを受け取り、my のタイプ food のエントリが既にあるかどうかを「確認」しようとしますdb_table(table1)。エントリがある場合、送信されたアンドロイドの数量エントリをデータベースに合計し、データベース内にあるデータとデータを合計して、フィールドを更新します。これが基本です。しかし、データベースから取得したデータを使用しようとすると、null 値が返されます。

誰かが私にいくつかのヒントを与えることができれば、私は本当に立ち往生しているので..

4

1 に答える 1

3

コードには多くの問題があります。この回答を Community Wiki としてマークし、他の人が見つけたものを編集および追加するよう招待します。

より具体的な質問があるまで、間違いが非常に多い場合は、代わりにhttps://codereview.stackexchange.com/に投稿することを検討してください。

不適切な変数補間

この行は、あなたが望むことをしません:

$w = "INSERT INTO table1(uquantity) VALUES ('$uquan[$index]')";

これは有効な PHP 構文ではありません。式を連結することもできます:

$w = "INSERT INTO table1(uquantity) VALUES ('".$uquan[$index]."')";

または、中括弧に式を埋め込むことができます。

$w = "INSERT INTO table1(uquantity) VALUES ('{$uquan[$index]}')";

または、クエリ パラメーター プレースホルダーを使用できます。

$w = "INSERT INTO table1(uquantity) VALUES (?)";
$stmt = mysqli_prepare($w) or die(mysqli_error());
$uqi = $uquan[$index];
mysqli_stmt_bind_param($stmt, "i", $uqi);
mysqli_stmt_execute($stmt);

MySQL API の混合

mysql_query()と混在することはできませんmysqli_fetch_array()。PHP には MySQL 用の API が複数あり、それらを混在させることはできません。古い mysql API は廃止されたため、mysqli API の使用を標準化する必要があります。

セミコロンは while ループを無効にします

while ステートメントの後のセミコロンはループをノーオペレーションにし、ループが終了すると $row には何も含まれません。

while ($row = mysqli_fetch_array($result)); {

次のようにする必要があります。

while ($row = mysqli_fetch_array($result)) {

変数の不適切な使用

単一引用符で囲まれた変数で $row キーを参照することは、複数の意味でおそらくあなたの意図とは異なります。

$d = "UPDATE table1 SET quantity = '$s' WHERE food = ".$row['$food']." ";

以前の SELECT クエリの選択リストの列名は、「$food」ではなく「food」です。

また、変数名 $food をキーとして使用するつもりでも、単一引用符で囲むと、変数の値が使用されず、リテラル文字列 '$food' になります。

文字列リテラルの引用に失敗しましたか?

さらに、SELECT クエリの food 列と比較するために引用符で囲まれたリテラルを使用しているため、文字列であると思われます。

したがって、UPDATE は次のようになります。

$d = "UPDATE table1 SET quantity = '$s' WHERE food = '".$row['food']."' ";

または:

$d = "UPDATE table1 SET quantity = '$s' WHERE food = " . intval($row['food']);

または、パラメータと準備されたクエリを使用することをお勧めします。その後、引用符や型について心配する必要はありません。

$d = "UPDATE table1 SET quantity = ? WHERE food = ?";
. . .

エラーチェックの失敗

構文エラー (引用符のない文字列など) があるか、参照する名前の列がテーブルにないか、権限の問題などが原因で、すべてのクエリが失敗する可能性があります。

SQL クエリを実行するときは、常にクエリ関数の戻りステータスを確認してください。エラーが発生した場合、関数は戻りfalseます。エラーが発生した場合は、エラー メッセージを確認する必要があります。

mysqli_query($mysqli, $d) or trigger_error(mysqli_error($mysqli), E_USER_ERROR);

UPDATE の実行に失敗しました

2 回目の更新では、SQL クエリ文字列が変数 $d に割り当てられますが、その更新クエリはまったく実行されません。

于 2013-08-02T21:19:09.683 に答える