代码之家  ›  专栏  ›  技术社区  ›  David

MySQL不执行更新

  •  0
  • David  · 技术社区  · 6 年前

    我试图提交一个AJAX请求来更新MySQL数据库中的一行。每当我试图通过AJAX提交请求时,行不会更新,但是每当我在数据库中直接测试查询和参数值时,行就会更新。

    这就是标记和AJAX的外观:

    $('body').on('change', '.cb_exempt', function() {
      var checked = this.checked;
      var business_id = $(this).attr('data-id');
      var jqxhr = $.post("php/update_exempt.php", {
          exempt: checked,
          business_id: business_id
        })
        .done(function(data) {
          alert("The business successfully updated");
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
          alert(errorThrown);
        });
    });
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>
    <table id="table_businesses" role="grid" aria-describedby="table_businesses_info">
      <thead>
        <tr role="row">
          <th aria-controls="table_businesses">Name</th>
          <th aria-controls="table_businesses">Active</th>
          <th aria-controls="table_businesses">Exempt from Billing</th>
          <th aria-controls="table_businesses">Billing History</th>
        </tr>
      </thead>
      <tbody>
        <tr role="row" class="odd">
          <td>[removed]</td>
          <td><input class="mx-auto cb_active" checked="checked" data-id="1" type="checkbox"></td>
          <td><input class="mx-auto cb_exempt" data-id="1" type="checkbox"></td>
          <td><a href="business.php?business_id=1">View Billing History</a></td>
        </tr>
      </tbody>
    </table>

    这就是我的PHP的样子:

    <?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST' || empty($_POST['exempt']) || empty($_POST['business_id'])) {
      // Get the database object from the configuration file
      $db;
      try {
        $db = include('config_consumer_database.php');
      } catch(PDOException $ex) {
        throw new Exception('Database exception.');
      }
    
      // Update the business' exempt status
      $stmt = $db->prepare('UPDATE IGNORE `business` SET `is_exempt` = :exempt WHERE `business_id` = :business_id;');
    
      // Execute the query passing the new exempt value and the business_id
      $stmt->execute(array(
        ':exempt' => $_POST['exempt'],
        ':business_id' => $_POST['business_id']
      ));
    } else {
      throw new Exception('The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated.');
    }
    ?>
    

    正如我所提到的,每当我尝试使用AJAX请求时,它都不会工作,但是我已经回显了查询字符串以及 $_POST 这样我就可以直接将输出复制/粘贴到MySQL数据库中,以确认查询将运行并且它确实运行。

    更新

    我确实注意到我的PHP代码有一个问题,因为我在条件语句中使用OR语句而不是AND语句,所以我修改了它。这并没有解决我的问题。

    我也接受了这个建议 isset strlen($_POST['...']) > 0 而不是 empty . 我两者都试过了,但都没有解决我的问题。

    我还尝试使用常规参数而不是命名参数,并将我的$POST直接传递到execute中,如下所示:

    // Update the business' exempt status
    $stmt = $db->prepare('UPDATE IGNORE `business` SET `is_exempt` = ? WHERE `business_id` = ?;');
    
    // Execute the query passing the new exempt value and the business_id
    $stmt->execute(array_values($_POST));
    

    这也没有解决我的问题。

    每当我检查JavaScript控制台日志时,提交AJAX请求后就不会显示任何内容。每当我检查error.txt日志(xampp>apache>logs>error.txt)时,在我提交AJAX请求之后就不会显示任何内容。

    在中发送的参数 $.POST 他们的要求和我期望的一样。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Abhishek Sharma    6 年前

    是否检查了mysql查询日志以确保正在执行的查询。

    可以按查询检查sql日志文件:

    show variables like '%log%';
    

    可以通过执行以下操作启用sql日志:

    set global general_log=1;
    

    可以通过以下方式设置日志文件:

    set global general_log_file='/var/log/mysql/mysql.log';

    请检查一次sql日志。

        2
  •  1
  •   David    6 年前

    我能够解决我的问题,它必须处理PHP是一种松散类型的语言。为了解决这个问题,我用 bindValue 使用显式转换$POST值 boolval intval ,然后我还指定了PDO参数类型:

    // Update the business' exempt status
    $stmt = $db->prepare('UPDATE IGNORE `business` SET `is_exempt` = :exempt WHERE `business_id` = :business_id;');
    
    // Add the parameters
    $stmt->bindValue(':exempt',      boolval($_POST['exempt']),     PDO::PARAM_INT);
    $stmt->bindValue(':business_id', intval($_POST['business_id']), PDO::PARAM_INT);
    
    // Execute the query passing the new exempt value and the business_id
    $stmt->execute();
    

    如果没有阿披实夏尔马建议检查SQL的常规日志,并认识到SQL实际上传递的是字符串值,而不是整数值,我就不会明白这一点:

    Execute UPDATE IGNORE `business` SET `is_exempt` = 'true' WHERE `business_id` = '1'
    

    更新

    事实上, 布尔瓦尔 不起作用。我不得不用这个方法来转换 $_POST 价值观: https://stackoverflow.com/a/38616262/1920035

        3
  •  0
  •   Akshay    6 年前

    一般来说,应该只对数组使用空值。 使用 strlen($_POST['exempt']) > 0 而不是 empty($_POST['exempt]) 以你的状态。