我有这段代码:
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)
类型食物的条目。如果有条目,我希望数据库将android发送的数量条目与数据库中的数据相加,并更新该字段。这基本上就是这样。但正如我所说,当我尝试使用来自数据库的数据时,我得到空值。
请有人给我一些提示,因为我真的被卡住了..
答案 0 :(得分: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_query()
与mysqli_fetch_array()
混在一起。 PHP有多个用于MySQL的API,你不能混用它们。您应该使用mysqli API进行标准化,因为旧的mysql API现已弃用。
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查询中的食物列进行比较,这使我认为它可能是一个字符串。
所以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,但之后根本不会执行该更新查询!