【问题标题】:Can't retrieve row containing '%' from database using PHP PDO无法使用 PHP PDO 从数据库中检索包含“%”的行
【发布时间】:2019-09-03 08:49:43
【问题描述】:

我正在制作一个具有自动完成产品搜索栏的网站。当用户输入几个字母时,我使用 LIKE 语句将它们与数据库进行比较,并返回看起来相似的产品。用户最多可以在搜索栏下方的下拉菜单中看到用户正在考虑的 4 种产品。现在,一旦用户单击结果,我就会将其传递回 PHP PDO 语句。

如果产品不包含%,它可以正常工作。但我有诸如“100% 产品 A”之类的产品,我似乎无法绕过它。我知道 % 在 LIKE 语句中使用。我用过like,但效果不是很好。我得到了我想要的产品的不同变体。我如何通过这个?

$pdo = new PDO($dsn, $user, $passwd);

//Retrieving Product Name
$prodName = $_GET['name'];

$stm = $pdo->prepare("SELECT * FROM products WHERE productName = ?");
$stm->bindValue(1, $prodName);
$stm->execute();

$row = $stm->fetch(PDO::FETCH_ASSOC);

$results[0] = $row["productName"]; 
$results[1] = $row["price"];
$results[2] = $row["quantity"];

$result=implode("','", $results);         
echo $result;

【问题讨论】:

  • 你的代码在哪里搜索?
  • @PaulSpiegel 搜索??
  • “我用 LIKE 语句将它们与数据库进行比较” - 你在代码中哪里使用了LIKE

标签: php mysql pdo


【解决方案1】:

由于% 具有特殊含义,您只需将其转义即可使其按字面意思使用,使用通常的\

\%  A % character; see note following the table

所以你只需要str_replace() all %\%

见:https://dev.mysql.com/doc/refman/8.0/en/string-literals.html

【讨论】:

    【解决方案2】:

    使用 LIKE 运算符检索包含 % 字符的行没有一个问题,更不用说使用代码中使用的比较运算符了。

    即使喜欢它也只能为您提供额外结果,但绝不会在获得现有结果方面造成问题。

    要声称存在此类问题,您必须通过发布Minimal Complete Verifiable example 来证明您的话,这样每个人都可以运行您的代码并确认问题确实存在。

    但是,在这种简单的情况下,您只会发现一些与 % 符号完全无关的简单错误,而不是证明。例如,您的搜索字符串被某些货物崇拜代码严重编码/转义,并自然成为数据库中没有任何匹配项的不同字符串

    【讨论】:

      【解决方案3】:

      好吧,我会使用str_replace从搜索字符串中删除%

      //Retrieving Product Name
      $prodName = str_replace('%', '', $_GET['name']);
      

      您也可以通过将百分比放在括号中或使用反斜杠来转义:

      //Retrieving Product Name
      $prodName = str_replace('%', '[%]', $_GET['name']); // \% would work too instead of [%]
      

      【讨论】:

      • 似乎不起作用,仍然返回一个空数组
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多