检查字符串是否在MySQL中的同一行

时间:2014-02-05 16:06:00

标签: php mysql sql

这是我正在做的活动的摘录:

//checkpoint A
        $allowed_area = array('MarketA', 'MarketB');
        $valid_area = in_array($area,$allowed_area) === true ? TRUE : FALSE;        
//checkpoint B      
        $crop_check = $db->query("SELECT Crop FROM crops");
        $allowed_product = $crop_check->fetchall(PDO::FETCH_COLUMN);
        $valid_product = in_array($product,$allowed_product) === true ? TRUE : FALSE;}

如果为TRUE,则两者都将为“1”。

这是我的示例消息:Eggplant MarketB(这两个字符串分别使用preg_split分为$product$area。)

这是我的IF声明:

if($valid_area == $valid_product){
   $crop_query = $db->query("SELECT Crop, Price, Area FROM crops WHERE Crop = '{$product}' AND Area = '{$area}' LIMIT 1");
            $result = $crop_query->fetch(PDO::FETCH_OBJ); 
            $message = "The current price of {$result->Crop} is P{$result->Price}/kg in {$result->Area}.  }

这是我的示例SQL表:

Crop     Price  Area
Eggplant 23     MarketA
Rice     45     MarketB

如上所示,代码将执行IF语句,因为两个语句都返回TRUE值。但是,结果将是一个错误,因为茄子和MarketB不存在于同一行。

关于如何合并两个检查点的任何建议,以便他们在执行IF语句之前必须检查同一行中是否存在$product$area


我只是解决了问题,如果结果是假的,它会回应“不够数据”,但是非常感谢解决方案。

2 个答案:

答案 0 :(得分:0)

您可以使用预准备语句并摆脱客户端匹配。请在这里查看PHP手册:

http://php.net/manual/de/mysqli.prepare.php

或者看看这里接受的答案:

how to bind multiple parameters to MySQLi query

答案 1 :(得分:0)

要理解你想要做什么有点难。我猜。

您的用户似乎已为$ area和$ product提供了价值。看起来你正在使用以下逻辑。

  1. 确保$ area具有有效值:在表格中提到的有效值。
  2. 确保$ product具有有效值:ditto。
  3. 在$ area中查找$ product的价格。
  4. 当特定产品在特定区域不可用时,即使区域和产品都有效,您也会遇到麻烦。

    您的软件需要更多规格。

    1. 当用户在火星上要求吃米饭时你想做什么? (无效区域)。
    2. 当用户在MarketA中请求独角兽时(无效产品),您想要做什么?
    3. 当用户在MarketA中要求提供Rice时,您想要做什么(两者都有效但不在一起)。
    4. 最后,当用户在MarketB中请求Rice时,您想要做什么? (有效查询)
    5. 这样的规格清晰度非常有帮助。实际上,可用的代码很容易从清晰的规范中流出。

      此列表中有三种故障模式和一种成功模式。如果你想把所有的失败模式都对待,这很容易,实际上比你拥有的更容易。此代码将进行查询并产生适当的结果。

      $crop_query = $db->prepare("SELECT Crop, Price, Area 
                                    FROM crops 
                                   WHERE Crop = ? 
                                     AND Area = ? 
                                   LIMIT 1");
      $message = "$product is not available for sale in $area";
      if ($crop_query->execute(array($product,$area))) {
          while ($result = $crop_query->fetch(PDO::FETCH_OBJ)) {
              $message = "The current price of {$result->Crop} is P{$result->Price}/kg in {$result->Area}"
          }
      }
      

      请注意使用ifwhile来处理查询的基本有效性以及结果集中行的可用性。在成功和失败的情况下,您最终都会收到可用的$消息。

      显然,LIMIT子句将结果集限制为单行,但使用while迭代结果集构建代码仍然是明智的。