PHP MySQL:搜索数据库中的字符串(在数组中)丢失的结果

Posted

技术标签:

【中文标题】PHP MySQL:搜索数据库中的字符串(在数组中)丢失的结果【英文标题】:PHP MySQL: Search database for string (in array) missing results 【发布时间】:2016-10-20 03:30:48 【问题描述】:

我正在创建一个在数据库中搜索字符串的功能。 php 使用 PHP 验证器没有显示错误,如果搜索词不存在,它会返回正确的错误。我的问题是,在标题为“搭配”的数据库列(目前是数据库中的唯一条目)中搜索“匆忙放弃”一词时,没有返回任何结果。虽然我可以使用 phpMyAdmin 看到这个条目确实存在。

用户使用以下 html 将字符串输入到输入字段中:

<form action='http://www.murkyfiles.esy.es/search.php' method='GET'>
  <center>
    <p><label for='search'>Please enter your question as accurately as possible:</label></p>
    <p><input type='search' size='90' name='search'></p>
    <p><input type='submit'  name='submit' value='Find answer'></p>
  </center>
</form>

使用以下 PHP 在数据库中搜索输入的术语:

<?php
$button = $_GET [ 'submit' ];
$search = $_GET [ 'search' ];
$host = "[HOST URL]";
$username = "[USERNAME]";
$password = "[PASSWORD]";
$database = "[DATABASE]";
$searchlength = strlen($search);

if( !$button )
  echo "You didn't submit a keyword";
else 
  if( strlen( $search ) <= 1 )
    echo "Search term too short";
  else 
    echo "You searched for <b> $search </b> <hr size='1' > </ br > ";

    // Connect to database

    $con = mysqli_connect ( $host, $username, $password );

    if(!$con) 
        die('Could not connect: ' .PDO::errorInfo());
    

    mysqli_select_db ( $con, $database );

    $search = str_split($search, $searchlength);

    $construct = " SELECT * FROM 'coll_test' WHERE collocation LIKE '%$search%' ";

    $run = mysqli_query( $con, $construct );

    //Fetch and return search results.

    if ($foundnum == 0)
        echo "Sorry, there are no matching results for <b> $search[0] </b>.
        </ br >
        </ br > 1. Try presenting your Something is wrong in a more academic manner. Guidance can be found on the majority of University websites without need for registration.
        </ br > 2. Try more common words/phrases with similar meaning. This search focuses on colloquialisms - commonly used phrases within a language.
        </ br > 3. Please check your spelling";

    else 
      echo "$foundnum results found !<p>";

      while ( $runrows = mysqli_fetch_assoc($run) ) 
          $collocation = $runrows ['collocation'];
        echo "<a href='$url'> <b> $title </b> </a> <br> $desc <br> <a href='$url'> $url </a> <p>";
      
    
  

我查看了各种类似的问题,但没有一个提供解决方案。

为了澄清,数据库表列标题如下:

搭配 | | 正确 | 长度 | 谷歌搜索结果 | 必应结果 | 雅虎结果 | 网址链接 | 维基 | 日期

到目前为止,我的数据库中只有一个条目:

collocation = abandon hastily
left = abandon
right = NULL
length = 2
google-results = 24000000
bing-results = 386000
yahoo-results = 385000
url-link = oxforddictionary.so8848.com/search1?word=abandon
wiki = 0
date = [TIMESTAMP]

【问题讨论】:

那么$foundnum在哪里定义的呢? 你为什么使用str_split 对不起,我的互联网有点喜怒无常。现在会试试看。我使用 str_split 是因为有人告诉我它必须是一个数组,而不是一个字符串......但我使用了两个搜索词“放弃敌意”,我想找到与整个字符串匹配的结果,而不仅仅是匹配的结果“放弃”和“敌意”分开。不知道如何使用爆炸。 【参考方案1】:

相当改写,附注如下:

$con = mysqli_connect ( $host, $username, $password, $database );

//$search = str_split($search, $searchlength); ///??? See below
$searchSafe = preg_replace("/[^0-9a-z-_ ]/i","",$search); //example only.

$construct = " SELECT COUNT(*) AS found FROM `coll_test` 
WHERE collocation LIKE '%".$searchSafe."%' ";

$run = mysqli_query($con, $construct);
$result = mysqli_fetch_array($run);

print $result['found']." number of results found!"; //for example.

1) 您可以在 MySQLi 连接函数中包含数据库引用。

2) str_split 返回一个 array 但您将结果用作字符串。这令人困惑和不正确,您打算如何处理?

$_GET['search'] 将始终是字符串类型,因此您无需将其用作数组或任何基于数组的操作。

3) 让外部函数手动返回 number_rows 计数可能不准确,instead use COUNTSELECT 语句中。

4) 您忘记返回实际查询的结果!所以上面我插入了一个mysql_fetch_array 结果来查看结果的数量。您也没有为 $foundnum 变量定义值。

5) 您将 PDO 与 MySQLi 混合使用,这两种连接方式互斥。它们不会混合。

6) 您对 SQL 注入和数据库妥协持开放态度,您需要使用准备好的语句(以及 Saty 的示例)并使用类似 preg_replace(或其他 REGEX 解析器)的东西从字符串中删除无效字符,如:

$searchSafe = preg_replace("/[^0-9a-z-%_ ]/i","",$search); //example only.

以上意味着字符串中只允许使用 0-9 或 a-z(不区分大小写,/i)或 -%_

7) 表名或列名 ('coll_test') 不应该用单引号括起来,而是应该用反引号括起来,如果有的话。在 MySQL 中,单引号用于包含数据字符串

【讨论】:

谢谢。这次重写,连同@Saty 的回答,已经解决了这个问题!【参考方案2】:

将引号表格和列名换成反引号,您的代码对 sql 注入用户准备和绑定语句打开以防止它

$search = $_GET ['search'];// get your value
$like = "%$search%";//
$stmt = $con->prepare("SELECT `collocation`,`left`,`right` FROM `coll_test` WHERE collocation LIKE ?");
$stmt->bind_param('s', $like);
$stmt->execute();
$stmt->bind_result($collocation,$left,$right);
$rows = $stmt->num_rows;// check your query return result of not
if ($rows > 0) 

    while ($stmt->fetch()) // fetch data from query
       printf ("%s (%s)\n", $collocation,$left,$right);
       // fetch data form result set
    
 else 
    echo "Sorry, there are no matching results for <b> $search </b>.";

【讨论】:

mysqli_fetch_assoc($run) $run 这里是什么?? @Saty 我已经更新了代码(可以在murkyfiles.esy.es/search.php查看)但它仍然没有返回任何结果 $_GET ['search'] 的值是多少??@DjDaihatsu。还要检查您的数据库中是否存在数据 在您的 phpmyadmin 中运行此查询并检查它返回的内容 SELECT * FROM coll_test WHERE collocation LIKE '%abandon hostility%' 在查询中使用列名而不是* !!检查更新的答案!阅读php.net/manual/en/mysqli-stmt.bind-result.php

以上是关于PHP MySQL:搜索数据库中的字符串(在数组中)丢失的结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP/MySql 用数组搜索数组

PHP 数组中的PHP搜索字符串 - 不区分大小写

数组中的PHP搜索字符串-不区分大小写

如何使用 MySQL 表过滤 php 数组?

如何使用 php 在 android 的 mysql 数据库中搜索此字符串是不是作为值存在?

php 在类似mysql的数组中搜索并获取元素,不区分大小写