繁体   English   中英

MySQL 查询字符串包含

[英]MySQL query String contains

我一直在尝试弄清楚如何使用 MySQL 进行查询,检查特定列中的值(字符串$haystack )是否包含特定数据(字符串$needle ),如下所示:

SELECT *
FROM `table`
WHERE `column`.contains('{$needle}')

在 PHP 中,function 被称为substr($haystack, $needle) ,所以也许:

WHERE substr(`column`, '{$needle}')=1

其实很简单:

mysql_query("
SELECT *
FROM `table`
WHERE `column` LIKE '%{$needle}%'
");

%是任何字符集(无、一个或多个)的通配符。 请注意,这在非常大的数据集上可能会变慢,因此如果您的数据库增长,您将需要使用全文索引。

用:

SELECT *
  FROM `table`
 WHERE INSTR(`column`, '{$needle}') > 0

参考:

WHERE `column` LIKE '%$needle%'

我在 mysql 中使用LOCATE

定位(substr,str),定位(substr,str,pos)

此函数是多字节安全的,并且仅当至少一个参数是二进制字符串时才区分大小写。

在你的情况下:

mysql_query("
SELECT * FROM `table`
WHERE LOCATE('{$needle}', `column`) > 0
");

除了@WoLpH 的回答。

使用LIKE关键字时,您还可以限制字符串匹配的方向。 例如:

如果您正在寻找以$needle开头的字符串:

... WHERE column LIKE '{$needle}%'

如果您正在寻找以$needle结尾的字符串:

... WHERE column LIKE '%{$needle}'

请注意,这是危险的:

WHERE `column` LIKE '%{$needle}%'

先做:

$needle = mysql_real_escape_string($needle);

所以它会阻止可能的攻击。

您可能正在寻找find_in_set函数:

Where find_in_set($needle,'column') > 0

该函数的作用类似于 PHP 中的in_array函数

接受的答案仅对 MySQL 是正确的,但由于问题正在使用:

  • 一个变量,
  • 似乎使用 {$needle} 作为替换标签,并且
  • 它提到PHP

作者似乎想使用 PHP 构建 MySQL 查询。

由于这个问题是 12 年前提出的, 目前的做法是使用预先准备好的语句来防止 SQL 注入。

这是 PHP 的示例:

function check_connection ($user, $pass, $db = 'test', $host = '127.0.0.1', $charset = 'utf8mb4') {
     if (isset($GLOBALS['conn']) && is_object($GLOBALS['conn']) && ($GLOBALS['conn'] instanceof PDO)) {
          if (same_database($db) === true) {
               $connection = &$GLOBALS['conn']; 
          }
          else {
               $GLOBALS['conn'] = pdo_connect($user, $pass, $db, $host, $charset);
               $connection = &$GLOBALS['conn'];       
          }
     }
     else {
          $GLOBALS['conn'] = pdo_connect($user, $pass, $db, $host, $charset);
          $connection = &$GLOBALS['conn'];
     }

     return $connection;
}

function pdo_connect ($user, $pass, $db, $host, $charset){    
     $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
     $options = [
       PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
       PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
     ];
     try {
       return new PDO($dsn, $user, $pass, $options);
     } 
     catch (\PDOException $e) {
       throw new \PDOException($e->getMessage(), (int)$e->getCode());
     }
}

function same_database($db) {
    if (isset($GLOBALS['conn']) && is_object($GLOBALS['conn']) && ($GLOBALS['conn'] instanceof PDO)) {
        $sql = "SELECT DATABASE() AS 'database'";
        $sth = $GLOBALS['conn']->prepare($sql);
        $sth->execute();
        if (strcasecmp(trim($sth->fetchAll(PDO::FETCH_ASSOC)['0']['database']), trim($db)) === 0) { 
            return true;
        }
    }

    return false;
}
    
$conn = check_connection($user, $pass, $db, $host, $charset);

$sql = "
     SELECT *
     FROM `table`
     WHERE `column` like :needle
";

// Concatenating the % wildcard before and after our search variable
$bind = array(
     ':needle' => '%'.$needle.'%'
);

$sth = $conn->prepare($sql);
$sth->execute($bind);

// Being redundant about fetch_assoc incase it was not set in pdo() options
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

// You would use rowCount(), instead of fetchAll(), if it is NOT a SELECT statement
// $sth->rowCount();

print_r($result);

以下是构建 PHP PDO 语句的两个资源:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM