首页 > 解决方案 > 即使在链接之后 SQL 也不会更新(使用 PHP)

问题描述

我将首先解释所有连接:

“订单.php”

我在这个文件中有一个表格,我使用 foreach 循环输出了信息,我想只关注“计划?” 然而列。

require_once('orders-claimed.vc.php');

<tr align="center" id="<?php echo $rowOrder['orderid']; ?>">
<td>
  <?php
  foreach($lstOrder as $rowOrder) {
  //access database table "orders" (snippet)


    if ($rowOrder['scheduled'] == 'YES') {
   ?>
   <button type="button" class="btn-success yes-button" name="yes" id="<?php echo $rowOrder['orderid'] ;?>">YES</button>
  <?php
} else if ($rowOrder['scheduled'] == 'NO') {
    ?>
   <button type="button" class="btn-danger no-button" name="no" id="<?php echo $rowOrder['orderid'] ;?>">NO</button>
  <?php
    }
   ?>
</td> 
</tr>

1

“订单-claimed.vc.php”

这个文件是 SQL 连接到表的地方,下面是“NO”按钮的片段(orders.php 中的 name="no")。

  require_once($routePath . "_mc/Order.mc.php");
  $mcOrder = new Order_MC();

        if (isset($_POST['no'])) {
    $mcOrder->Scheduled_Yes($db, $orderid);
  }

“订单.mc.php”

finally 这里是 SQL 代码所在的位置。

<?php
public function Scheduled_Yes($db, $orderid, $scheduled) {
 $stmt = $db->prepare(
   " UPDATE order
     SET scheduled = 'YES'
     WHERE orderid = :orderid "
 );

 $stmt->bindValue(':orderid', $orderid, PDO::PARAM_INT);
 $stmt->bindValue(':scheduled', $scheduled, PDO::PARAM_INT);
 $stmt->execute();
 $rowAffected = $stmt->rowCount();

 return $rowAffected;
}

在此处输入图像描述

任何帮助,将不胜感激。

更新:

变化:

“订单-claimed.vc.php”

$mcOrder->Scheduled_Yes($db, $orderid, $scheduled);

“订单.mc.php”

WHERE orderid = :orderid AND 预定 = :scheduled "

即使调用参数和 WHERE,两者仍然无效

标签: phpsql

解决方案


Magandang umaga(基于应用程序屏幕截图中的货币类型,假设您是 Pinoy);

您应该尝试在绑定过程中不传递任何类型指定参数的情况下运行代码。如果您想确保这些值作为预期类型传递,您可以将它们存储在类型转换的变量中,然后将它们传递给 bindValue 方法。您也不应该在 SQL 查询之前和之后留下不必要的空格,或者至少以分号 (;) 结束该行,否则您最终会遇到问题,如果您没有将应用程序/服务器设置为抛出详细的错误异常,您可能会无法知道发生了什么。

我还建议您开发一个 CRUD 类,您可以在其中通过自定义构建的选择、更新、删除等函数访问和传递值作为数组,以最大限度地减少出错的可能性。如果您在整个应用程序中一遍又一遍地对数据库操作进行硬编码,则很可能最终会出错。

因此,您可以通过创建一个数据库类并将其包含在您的应用程序库中来解决这个问题。然后在您想使用它们的任何地方调用方法:

<?php
class Database extends PDO {
  public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS) {
    parent::__construct($DB_TYPE . ':host=' . $DB_HOST . ';dbname=' . $DB_NAME . '', $DB_USER, $DB_PASS);
    Database::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }
  public function update($table, $data, $where) {
    // Don't forget to sort the data by key with ksort function, so that they won't be causing you headache, just in case
    ksort($data);
    $dataKeys = null;
    foreach ($data as $key => $value) {
      $dataKeys .= "`$key`=:$key,";
    }
    $dataToSQL = rtrim($dataKeys, ',');
    $stmt = $this->prepare("UPDATE $table SET $dataToSQL WHERE $where");
    // Loop to bind data
    foreach ($data as $key => $value) {
      $stmt->bindValue(":$key", $value);
    }
    $stmt->execute();
    $rowAffected = $stmt->rowCount();
    return $rowAffected;
  }
}

所以然后在 order.mc.php 中,或者你想包含这个函数的任何地方(根据你问题中的细节,我假设这应该是正确的地方):

<?php
public function Scheduled_Yes($orderid, $scheduled) {
    $db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
    $postData = array("scheduled" => $scheduled);
    $where = "`scheduled` = '{$scheduled}' AND `orderid` = {$orderid}";
    $result = $db->update("order", $postData, );

    /*
    You'll have to store this within a variable in order for it to work healthy,
    because you're returning the affected row count in your method,
    so I included it in my code as well. If you didn't want to have
    the affected row information you could run this method just as is. So:
    */
    return $result;
}

就像我说的,我建议您创建一个对象类,它可以让您在整个应用程序中更轻松、更灵活地使用创建、读取、更新、删除操作。这样您就不必担心在数据库操作过程中出错了。

最后在orders_claimed.vc.php文件中调用这个函数:

require_once($routePath . "_mc/Order.mc.php");
$mcOrder = new Order_MC();

if (isset($_POST['no'])) {
  $mcOrder->Scheduled_Yes($orderid, $scheduled);
}

没有要传递给此方法的 $db 变量。所以这也是你的代码中的一个主要问题。您可能应该在您的 .htaccess 文件中设置您的 error_reporting(或者您可能还需要编辑您的 php.ini 文件)以获得详细的错误报告,以便在部署之前调试您的代码。我希望这可以帮助您解决问题。

干杯!


推荐阅读