【问题标题】:Run a query if directed to page如果定向到页面,则运行查询
【发布时间】:2015-09-11 10:33:56
【问题描述】:

我正在运行以下选择语句:

$oid = ("SELECT DISTINCT (MAX(OrderID)) FROM orders WHERE Username = ". $_SESSION['Username'] ." ");

这将返回链接到该用户名的最高订单 ID 的值,因此这是他们的最后一个订单。然后我想运行这个查询:

$Query = "update orders set Status = 'Failed' where Status = 'Success' and where OrderID = ". $oid ." ";

这将更新订单表,将状态设置为失败(当前为成功)。

为什么 $oid 什么都不返回?如果我手动输入值并通过 PHPMyAdmin 运行它,它可以正常工作。

if (strpos($url,'order-failed') !== false) {
    $query = "SELECT DISTINCT (MAX(OrderID)) FROM orders WHERE Username = '". $_SESSION['Username'] ."' ";
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    echo $row['OrderID']; // For Debugging
    echo "<br /><br />";

    $Query = "UPDATE orders SET Status = 'Failed' WHERE Status = 'Success' and OrderID = ". $oid ." ";
    $mysqli->query($Query);
    echo $Query; // For Debugging
}

回声返回: 从订单中选择 DISTINCT (MAX(OrderID)) 用户名​​ = 'email@email.com' 更新订单 SET Status = 'Failed' WHERE Status = 'Success' and OrderID =

订单 ID 为空! :(

【问题讨论】:

  • $oid = (...) 不运行查询。您只需创建一个包含查询的变量。
  • $mysqli->query($oid);我在查询下面有这个。
  • 顺便说一句:您的代码容易受到SQL Injection 的攻击。要修复这个关键的安全漏洞,请使用 Prepared Statements。
  • 一旦它工作起来,我会修复所有漏洞。感谢您的提醒!
  • 您可以添加更多您拥有的代码吗?据我了解 mysql->query 将返回一个包含您想要的值的结果。您需要从中提取值。查看文档:php.net/manual/en/function.mysql-query.php

标签: php mysql


【解决方案1】:

$oid 什么都不返回,因为它不是函数/方法,它是字符串类型的变量(隐式)。为什么你会期望一个字符串“返回”一些东西?

至于您的第二个查询,$oid 当然是空的。你之前没有给它分配任何东西。您不应该将第一个查询的结果分配给变量,以便您可以在第二个查询中使用该 orderID (oid) 吗?去做吧!

【讨论】:

  • Markus,根据此评论判断,我将 $oid 存储为一个变量,该变量等同于我正在运行的查询,因此我需要以某种方式提取返回的数字,即 5,然后将其另存为变量?
  • 正如我所说:问题是“你用$oid 做什么?你需要向我们展示你是如何运行查询的!粘贴更多代码!
  • 好的,让我解释一下。如果您在 order-failed.php 上,我有此代码,请从用户名等于 $_SESSION['Username'] 的订单中选择 OrderID。然后,它将 OrderID 作为数字抓取,即如果它是订单 9,我将“9”作为值,然后我运行另一个语句来更新 OrderID 等于 $oid 的订单...
  • 不要在 cmets 中发布您的代码,编辑您的问题以显示您获取数据的整个代码。
【解决方案2】:
  1. 你不需要使用WHERE两次:

    UPDATE 订单设置 Status = 'Failed' where Status = 'Success' and where OrderID = ".$oid

  2. 更喜欢在复杂查询中使用AS 关键字:

    SELECT DISTINCT (MAX(OrderID)) AS highest_order_id FROM orders WHERE Username = ...
    
  3. 你获取查询的结果吗?

    $result = $mysqli->query($oid);
    $row0 = $result->fetch_assoc();
    $highest_order_id = $row0["highest_order_id"];
    
    $Query = "UPDATE orders SET Status = 'Failed' " . 
             "WHERE Status = 'Success' AND OrderID = ". $highest_order_id ." ";
    

请注意我的示例代码仍然容易受到SQL Injection的攻击!

【讨论】:

    【解决方案3】:

    为什么 $oid 什么都不返回?

    首先,检查错误:

    $result = $mysqli->query($oid);
    if (!$result)
    {
      echo("Error description: " . $mysqli->error);
    }
    

    然后,检查数据。

    // Query
    echo $oid;
    // Result
    echo $result->num_rows;
    

    很可能是您的查询根本没有返回任何内容(没有错误),然后您应该能够在查询中发现它。

    【讨论】:

    • 这很有帮助,但是 - 我显然没有错误!如果我通过 PHPMyAdmin 手动运行查询,它会返回我需要的值,这很奇怪。
    • 那么我很确定查询不完全相同。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多