Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从表1查询MySQLi并将详细信息更新到表2_Php_Mysql_Mysqli - Fatal编程技术网

Php 从表1查询MySQLi并将详细信息更新到表2

Php 从表1查询MySQLi并将详细信息更新到表2,php,mysql,mysqli,Php,Mysql,Mysqli,我被以下问题困扰了数周,无法找到解决方案: 我有两个数据库表。我想使用MySQLi查询从第一行中选择一行,从另一行中选择更多行。 第一个名为“users”的表,我在这里存储用户当前的货币信息。第二个表存储有关他的“宠物”的信息。 我已经走了这么远。。。但我也想通过点击提交更新宠物的一个信息 这是我的代码: $statement = $mysqli->prepare("SELECT money FROM users WHERE fbid = ?"); $statement->bin

我被以下问题困扰了数周,无法找到解决方案:

我有两个数据库表。我想使用MySQLi查询从第一行中选择一行,从另一行中选择更多行。 第一个名为“users”的表,我在这里存储用户当前的货币信息。第二个表存储有关他的“宠物”的信息。 我已经走了这么远。。。但我也想通过点击提交更新宠物的一个信息

这是我的代码:

$statement = $mysqli->prepare("SELECT money FROM users WHERE fbid = ?");
  $statement->bind_param("s", $_SESSION['FBID']);
  $statement->execute();
  $statement->bind_result($money);
  while ($statement->fetch());
  $statement->close();

if($stmt = $mysqli->prepare("SELECT clean,health,petname FROM pets WHERE fbid = ?")){

   $stmt->bind_param('s',$_SESSION['FBID']);

   $stmt->execute();

   $stmt->store_result();

   $num_of_rows = $stmt->num_rows;

   $stmt->bind_result($clean,$health,$petname);

   while ($stmt->fetch()) {

        if($_GET['buy']=='clean' && $money>='5' && $clean<='95'){
  $stmt2 = $mysqli->prepare("UPDATE pets SET `clean` = `clean` + 5 WHERE fbid = ? AND petname = ?");
  $stmt2->bind_param("ss", $_SESSION['FBID'],$_GET['identifier']);
  $stmt2->execute();
  $stmt2->close();
  $stmt3 = $mysqli->prepare("UPDATE users SET `money` = `money` - 5 WHERE fbid = ?");
  $stmt3->bind_param("s", $_SESSION['FBID']);
  $stmt3->execute();
  $stmt3->close();
            header( "Location: /pets.php?success=clean" );
        }
        if($_GET['buy']=='health' && $money>='7' && $health<='90'){
  $stmt4 = $mysqli->prepare("UPDATE pets SET `health` = `health` + 10 WHERE fbid = ? AND petname = ?");
  $stmt4->bind_param("ss", $_SESSION['FBID'],$_GET['identifier']);
  $stmt4->execute();
  $stmt4->close();
  $stmt5 = $mysqli->prepare("UPDATE users SET `money` = `money` - 7 WHERE fbid = ?");
  $stmt5->bind_param("s", $_SESSION['FBID']);
  $stmt5->execute();
  $stmt5->close();
            header( "Location: /pets.php?success=health" );
        }

echo "".$petname." welcomes you!<br>";      
if($health<='90' && $money>='7'){
echo "<form method='GET'><input type='hidden' name='identifier' value='".$petname."'><input type='hidden' name='buy' value='health'><input type='submit' value='Healthcare (G$7)'></form>";
}
if($clean<='95' && $money>='5'){
echo "<form method='GET'><input type='hidden' name='identifier' value='".$petname."'><input type='hidden' name='buy' value='clean'><input type='submit' value='Clean (G$5)'></form>";
}
   }

   $stmt->free_result();

   $stmt->close();
}
在我单击submit之前,它工作得非常好。然后它会更新所选宠物的值,但会更新值,更新次数与我拥有的宠物数量相同。我只想更新一次,但我必须在一页中打印出所有宠物信息

那我该怎么做呢

我无法使用get_result,因为它未安装在服务器上


谢谢大家

将更新宠物的逻辑与显示宠物的逻辑分开。您当前处于显示循环内,因此每次显示循环迭代都会更新一个宠物。当您将更新代码移到while循环之外时,您将只更新宠物信息一次,但仍会在一个循环中显示所有宠物。

好的,这很清楚,但是如果$\u GET['buy']=='clean'&&$money>='5'&&$clean@krisz44g您使用$_GET['identifier']值来识别正确的宠物。嗯,但是如果我只是这样做并分开更新,那么我就无法在发送请求之前准确地检查钱的价值,因此如果出现按钮,因为当页面加载时我仍然有钱,但我也打开另一个窗口并将钱花在其他东西上,它将接受请求,就好像我仍然有钱一样。这是我的问题。有什么想法吗?@krisz44g您仍然可以通过SELECT查询读取并检查用户拥有的资金。当您有足够的钱时,您可以通过第二次选择查询来检查特定宠物的“清洁”值,您可以使用$\u GET['identifier']值。如果您有钱且“clean”值有效,则运行更新查询。毕竟,你仍然有你的正常while循环来打印所有的宠物,不管你是否运行过像clean或health这样的操作。