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 应用程序接收了一些数据,并且我尝试“查看”,如果已经有我的食物类型的条目db_table(table1)。如果有条目,我希望 db 将发送的 android 的数量条目相加,数据与我的 db 中的条目相加,并更新该字段。基本上就是这样了。但正如我所说,当我尝试使用来自数据库的数据时,我得到空值。

请如果有人能给我一些提示,因为我真的被卡住了..

4

1 回答 1

3

你的代码有很多问题。我将此答案标记为社区 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,你不能混合使用它们。您应该标准化使用 mysqli API,因为旧的 mysql 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);

执行更新失败

您的第二次更新将 SQL 查询字符串分配给变量 $d,但随后根本不执行该更新查询!

于 2013-08-02T21:19:09.683 回答