【问题标题】:Mysql SELECT with WHERE clause not working with variable带有 WHERE 子句的 Mysql SELECT 不适用于变量
【发布时间】:2015-03-13 01:52:25
【问题描述】:

我正在拔头发。我有两个基本相同的主体的 SELECT 语句。第一个正在工作,而第二个在其中的 WHERE 子句中不起作用。我需要一些新鲜的眼光和建议。我去过每个论坛并阅读了每个帖子,并尝试了许多“解决方案”但无济于事。希望有人能看到我错过的东西。

$oID = zen_db_prepare_input($_GET['oID']);

  // Color coding for invoice -Start queries---

  $query = "SELECT * FROM cart1_orders WHERE orders_id = $oID";
  $result = $db->Execute($query); 
  $shiploc = $result->fields['shipping_method'];
  if ($result->RecordCount() > 0) { 
  echo 'Test Query: = ' . $result->fields['shipping_method']; 
  } else { 
  echo 'Sorry, no record found for product number ' ; 
  }  

  $sql = "SELECT * FROM cart1_store_locations  WHERE pickup_name= $shiploc";
  $results = $db->Execute($sql); 
  $newcolorblock = $results->fields['color_code'];
  if ($results->RecordCount() > 0) { 
  echo 'Color Query: = ' . $results->fields['color_code'];
  echo 'Location: = '. $results->fields['pickup_name']; 
  } else { 
  echo 'Sorry, no record found for Color Code ' ; 
  }  

提前感谢您的帮助和建议,希望您能看到我看不到的东西。

第一个查询结果:测试查询:= Store Pickup (Mooresville - Gold's Gym) 第二次查询结果:WARNING:出现错误,请刷新页面重试。

如果 WHERE 子句被删除,它会返回值但不是正确的值。我需要 WHERE 语句来提取正确的信息。

ANSWER由bloodyKnuckles提供:)

$sql= "SELECT * FROM cart1_store_locations WHERE pickup_name= $shiploc";

改为:(表数据中需要转义为comp for )

$shiploc_escaped = mysql_escape_string($shiploc);
$sql = "SELECT * FROM cart1_store_locations  WHERE pickup_name=       '".$shiploc_escaped."'";

我以前没有使用过这个论坛。爱它!!!谢谢大家!

【问题讨论】:

  • $shiploc 是字符串吗?看来您将其视为整数(未引用)。
  • 是的,应该是字符串。我已经尝试过使用单引号,但这也不起作用。
  • 你真的应该了解 SQL 连接和参数化语句。
  • 是的,我也尝试过加入,但也无法正常工作。到目前为止,这实际上产生了更好的结果,所以我一直坚持下去。我确实计划在这个项目之后多玩一点。我只需要这个工作......就像现在一样。大声笑
  • 引用和转义您的数据。 php.net/manual/en/mysqli.real-escape-string.php

标签: php mysql variables select where


【解决方案1】:

因为你的字符串中有一个单引号:

商店取货(Mooresville - Gold's Gym)

...你需要转义变量$shiploc:

$shiploc_escaped = addslashes($shiploc);
$sql = "SELECT * FROM cart1_store_locations  WHERE pickup_name= '".$shiploc_escaped."'";

阅读Zen Cart Escaping Content,看来这是一个选项:

$sql = "SELECT * FROM cart1_store_locations  WHERE pickup_name= '".$db->prepare_input($shiploc)."'";

...而且,更好的是,这个:

$sql = "SELECT * FROM cart1_store_locations WHERE pickup_name= :pickup_name:";
$sql = $db->bindVars($sql, ':pickup_name:', $shiploc, 'string');

【讨论】:

  • 我想吻你!!!!这工作谢谢你!一个问题......我很确定 zen cart 使用 mysqli,所以这就是我在自定义页面中一直使用的。不是这样吗?你知道吗?
  • php.net/manual/en/mysqli.real-escape-string.php 要求将连接传递给该函数。 mysqli_real_escape_string($shiploc) 将失败。
  • 谢谢!我非常感谢所有的帮助。
  • @kgiggles 不客气,但答案需要反映对该功能的更改。否则,如果 cmets 碰巧消失了,未来的访问者可能不知道该怎么办。
  • @bloody... OP 正在使用 mysqli_,您所做的编辑 mysql_escape_string($shiploc) 将失败。这些不同的 API 不会相互混合。
【解决方案2】:

您的$shiploc 可能是null。在第二次查询之前,请写信var_dump($shiploc);,让我们知道你得到了什么。

编辑

$oID = zen_db_prepare_input($_GET['oID']);

  // Color coding for invoice -Start queries---

  $query = "SELECT * FROM cart1_orders WHERE orders_id = $oID";
  $result = $db->Execute($query); 
  $shiploc = $result->fields['shipping_method'];
  if ($result->RecordCount() > 0) { 
  echo 'Test Query: = ' . $result->fields['shipping_method']; 
  } else { 
  echo 'Sorry, no record found for product number ' ; 
  }  

  $sql = "SELECT * FROM cart1_store_locations  WHERE pickup_name= '".$shiploc."'";
  $results = $db->Execute($sql); 
  $newcolorblock = $results->fields['color_code'];
  if ($results->RecordCount() > 0) { 
  echo 'Color Query: = ' . $results->fields['color_code'];
  echo 'Location: = '. $results->fields['pickup_name']; 
  } else { 
  echo 'Sorry, no record found for Color Code ' ; 
  }  

【讨论】:

  • string(39) "Store Pickup (Mooresville - Gold's Gym)" 这是结果。它应该如何显示。
  • 所以它是一个字符串...因此您需要在$shiploc 之间使用单引号检查我的答案。我要编辑它
  • 我已经尝试过单引号,但我仍然得到错误。 '$shiploc'
  • 请尝试我的答案'".$shiploc."'"复制并粘贴我的答案,它会起作用
  • 我也试过这个组合。让我再试一次。会让你知道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多