【问题标题】:Multiple MySql Insert & Updates not running as expected多个 MySql 插入和更新未按预期运行
【发布时间】:2014-10-01 00:03:59
【问题描述】:

我正在尝试将信息插入到一个表中,并在一个字符串中更新另一个表(在同一个数据库中)中的两行。我的印象是,您可以通过在每次尝试后添加一个分号来非常简单地做到这一点,它会在同一个字符串中单独操作它们。

我想不出任何其他方法来实现在“games”表中插入数据并同时更新“players”表中两个唯一行中的数据的预期效果。

这是我的代码...

<?php

include_once('database-details.php');

$winner         = mysqli_real_escape_string($db, $_REQUEST['winner']);
$loser              = mysqli_real_escape_string($db, $_REQUEST['loser']);
$balled         = mysqli_real_escape_string($db, $_REQUEST['balled']);
$fixtures           = 'games';
$table              = 'players';

$sql = "INSERT INTO `$fixtures` "
    . "(`id`, `winner`, `loser`, `balled`) VALUES "
    . "(NULL, '$winner', '$loser', '$balled') ;"
    . "UPDATE `$table` SET apps = apps + 1, wins = wins + 1, balled = balled + $balled WHERE id = $winner ;"
    . "UPDATE `$table` SET apps = apps + 1, losses = losses + 1, balled = balled - $balled WHERE id = $loser";

if(!$result = $db->query($sql)){
    die('There was an error running the query [' . $db->error . ']');
}

$response = (object)array('status' => 'error');

if($result){
    $response = (object)array(
        'status'    => 'ok',
        'id'        => $db->insert_id,
    );
}

header('Content-type: application/json');
echo json_encode($response);

?>

脚注... 表单使用ajax提交,然后更新前端的内容。我可以确认,当我测试过的请求中只有一个请求时,所有三个单独提交并且每个都运行良好时,提交工作正常。只有当我将它们组合起来时它才会中断。

提前感谢您的帮助。

【问题讨论】:

标签: php mysql sql database mysqli


【解决方案1】:

您必须在同一个查询中执行更新查询吗?

也没有意义

$response = (object)array('status' => 'error');

if($result){

因为你已经停止了上面那行的脚本执行

if(!$result = $db->query($sql)){

不妨试试:

<?php

include_once('database-details.php');

$winner         = mysqli_real_escape_string($db, $_REQUEST['winner']);
$loser              = mysqli_real_escape_string($db, $_REQUEST['loser']);
$balled         = mysqli_real_escape_string($db, $_REQUEST['balled']);
$fixtures           = 'games';
$table              = 'players';

$sql = "INSERT INTO `$fixtures` "
    . "(`id`, `winner`, `loser`, `balled`) VALUES "
    . "(NULL, '$winner', '$loser', '$balled') ;"

if(!$result = $db->query($sql)){
    die('There was an error running the query [' . $db->error . ']');
else{
    $insertid = $db->insert_id
    $sql = "UPDATE `$table` SET apps = apps + 1, wins = wins + 1, balled = balled + $balled WHERE id = $winner ;"
    if(!$result = $db->query($sql)){
        die('There was an error running the query [' . $db->error . ']');
    }
    $sql = "UPDATE `$table` SET apps = apps + 1, losses = losses + 1, balled = balled - $balled WHERE id = $loser";
    if(!$result = $db->query($sql)){
        die('There was an error running the query [' . $db->error . ']');
    }
    $response = (object)array(
        'status'    => 'ok',
        'id'        => $insertid ,
    );
}

header('Content-type: application/json');
echo json_encode($response);

?>

根据您的 $db 类,如果您在一个查询中运行多个 sql 语句,则 insert_id 的值可能不是您所期望的。

【讨论】:

    【解决方案2】:

    这看起来像是一个并发问题。您可能想使用关闭自动提交,并使用 mysqli_begin_transaction() 设置块,执行您的查询和 mysqli_commit() 来处理块。

    类似:

        mysqli_autocommit($db, FALSE);
        mysqli_begin_transaction();
        //now call query() as many times as needed
        mysqli_commit(); 
    

    【讨论】:

      【解决方案3】:

      感谢大家的快速回复。最后,为 mysqli_multi_query() 提供的链接@AR 起到了作用。这是它现在的样子(如果有人感兴趣的话)......

      <?php
      
      include_once('database-details.php');
      
      $winner    = mysqli_real_escape_string($db, $_REQUEST['winner']);
      $loser     = mysqli_real_escape_string($db, $_REQUEST['loser']);
      $balled    = mysqli_real_escape_string($db, $_REQUEST['balled']);
      $fixtures  = 'games';
      $table     = 'players';
      
      $sql = "INSERT INTO `$fixtures` "
          . "(`id`, `winner`, `loser`, `balled`) VALUES "
          . "(NULL, '$winner', '$loser', '$balled') ;"
          . "UPDATE `$table` SET apps = apps + 1, wins = wins + 1, balled = balled + $balled WHERE id = $winner ;"
          . "UPDATE `$table` SET apps = apps + 1, losses = losses + 1, balled = balled + $balled WHERE id = $loser";
      
      if (!$db->multi_query($sql)) {
          echo "Multi query failed: (" . $db->errno . ") " . $db->error;
      }
      
      do {
          if ($result = $db->store_result()) {
              $response = (object)array(
                  'status'    => 'ok'
              );
              $result->free();
          }
      } while ($db->more_results() && $db->next_result());
      
      header('Content-type: application/json');
      echo json_encode($response);
      
      ?>    
      

      PS - 感谢@Hadyn Dickson 对查询的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多