【问题标题】:how to handel % in post method in php [closed]如何在 php 中处理 post 方法中的 % [关闭]
【发布时间】:2021-05-20 07:22:34
【问题描述】:

我使用具有 % 值的 post 方法在 php 变量中发送一个 mysql 查询;

 $Brand= 'SELECT BRAND_CODE FROM product WHERE STATUS='1' AND UNIT_CODE like '%"81"%'';

$Brand=$_POST['Brand'];

echo $Brand;

结果是

    SELECT BRAND_CODE FROM product WHERE STATUS='1' AND UNIT_CODE like '%

我怎样才能使用这个获得完整的字符串

【问题讨论】:

  • 这里的解决方案是参数化查询......无论如何你都应该使用它。
  • 请分享更多详细信息 - 您是如何确切构建该 SQL 查询的?
  • P.S.作为示例,您显示的代码实际上没有任何意义。这不是有效的语法,它会覆盖 $Brand 并且它没有显示您实际上如何尝试包含真实的用户输入。
  • 如图所示写入变量
  • 你用的是哪个mysql数据库? mysqli? PDO?还有什么?它们都支持参数化查询。在所有情况下,您传入的值都应通过参数完成。 LIKE 通配符与其他任何东西并没有什么不同。教程可以告诉你。如果您告诉我们数据库库,我们可能会为您指出本网站上有关此确切主题的先前问题。

标签: php mysql api post


【解决方案1】:
$Brand= "SELECT BRAND_CODE FROM product WHERE STATUS='1' AND UNIT_CODE like '%81%'";
$Brand=$_POST['Brand'];

echo $Brand;

结果会是这样的:

SELECT BRAND_CODE FROM product WHERE STATUS='1' AND UNIT_CODE like '%81%'

【讨论】:

  • And the result will be like...实际上不会,结果将是$_POST["brand"]的内容。 SQL 将被覆盖。 OP 的代码在这方面毫无意义……最好不要完全复制它。
【解决方案2】:

您应该在涉及变量的任何时候使用准备好的语句,尤其是当它们来自 $_GET/$_POST 请求时,以避免 MySQL 注入。

虽然您的请求不是很清楚,但我还是在黑暗中试探,并假设您正在尝试至少基于某种用户交互运行该查询的不同或修改版本 - 而我还没有测试过下面的代码,它应该可以作为一个很好的起点,让您可以使用准备好的语句和 PDO 安全地修改查询。

您可以查看以下链接以供参考https://phpdelusions.net/pdo

<?php
// Configure the below based on your DB
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

// Leave this as-is
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

// Attempt connection here accessed via $pdo below
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

// Get your brand variable from post request
$brand = "%{$_POST['Brand']}%";

// Prepare an SQL statement with your status and brand variables
$stmt = $pdo->prepare("SELECT BRAND_CODE FROM product WHERE status = ? AND UNIT_CODE LIKE ?");

// Execute the above statement, bind variables here to avoid MySQL injection
$stmt->execute([ 1, $brand ]);

// Retrieve your results (if any)
$results = $stmt->fetchAll();

// Clean up, checks and do what you will with the results..

【讨论】:

  • 作为一个通用示例,我在这里唯一要提出的问题是使用“root”作为数据库登录名。 Web 应用程序(甚至是测试版本)以 root 身份登录是非常糟糕的做法。它永远不应该出现在示例中,因为人们通常倾向于逐字逐句/逐字复制他们不完全理解或不感兴趣的部分。如果您要展示最佳实践,那就太好了如果整个示例在各个方面都证明了这一点。 :-)
  • 其实。我也不确定catch (\PDOException $e) { throw new \PDOException($e-&gt;getMessage(), (int)$e-&gt;getCode()); }。那到底有什么意义呢?它似乎只是捕获并重新抛出完全相同的异常。如果您正在捕获异常,请记录它们并输出干净的错误消息或其他内容。如果您只是要重新抛出,那么节省一些 CPU 并让异常自行冒泡。
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多