【问题标题】:search using pdo, mysql and php使用 pdo、mysql 和 php 进行搜索
【发布时间】:2011-03-21 18:31:22
【问题描述】:

我正在尝试使用 PDO,并且想知道以下是否是搜索关键字的正确代码,因为它给了我一个错误:mysql_real_escape_string(): [2002] A connection attempt failed because connected host has failed to respond.

php类:

public function searchQuotes() 
        {
            $search = mysql_real_escape_string($_POST['search']);

            $sql = "SELECT cQuotes, vAuthor, cArabic, vReference FROM thquotes WHERE cQuotes LIKE '% :search %' ORDER BY idQuotes DESC";


                  try {

                      $query = $this->_db->prepare($sql);
                      $query->bindParam(':search', $search, PDO::PARAM_STR);
                      $query->execute();

                      if(!$query->rowCount()==0)
                      {
                               while($row = $query->fetch())
                        {
                            echo $this->formatSearch($row);
                        }


                      }
                      else
                         {
                            echo "No results found!";
                         }
                      $query->closeCursor();
                    }
                  catch (Exception $ex){

                        echo "Something went wrong " . $ex;
                    }
        }

        public function formatSearch($row) 
        {
            $cQuote =  highlightWords(htmlspecialchars($row['cQuotes']), $search);

            return "<p id=\"s_arabic\">" . $this->h($row['cArabic']) . "</p><br />"
            . "<p id=\"s_quotes\"><q>&nbsp;" . $cQuote . "&nbsp;</q></p><br />"
            . "<p id=\"s_author\"><b>-</b>&nbsp;" . $this->h($row['vAuthor']) . "</p><br />"
            . "<p id=\"s_reference\"><span class=\"source\">Source:</span> " . $this->h($row['vReference']) . "</p>"; 
        }

php页面:

if (isset($_POST['search'])) 
    $quotes->searchQuotes();

else
   $quotes->displayQuotes();

displayQuotes() 可以很好地显示引号,所以我假设连接本身没有问题。

【问题讨论】:

    标签: php search pdo


    【解决方案1】:

    使用 PDO 和绑定参数/准备好的语句,您不需要转义字符串。你如何设置它,PDO 应该自动为你转义它。

    由于您使用的是 PDO,因此您没有使用 mysql_connect 驱动程序,因此您不能使用 real_escape_string 函数,因为它需要使用 mysql_connect 与 mysql 服务器建立有效连接。

    编辑:

    不确定这个 if 语句,但可能有问题:

     if($query-&gt;rowCount()&gt;0)

    使用 imo 会更好。这可能是也可能不是问题。另一个问题是您应该检查error information 并在出现某种错误时提醒自己。

    【讨论】:

    • 感谢您指出这一点。那里有任何其他错误,因为它说no results found,即使该关键字有引号。
    • 好吧,like 语句中的额外空格如果被空格包围,则只会找到搜索字符串(不确定这是否是故意的)。但我很少使用 bindparam 方法,所以我不能 100% 确定该功能。鉴于这些空格是故意的,查询看起来没问题。但是,使用这些空格,如果搜索关键字位于开头或结尾,则不会匹配,因为它需要空格来匹配它。
    • 那么您将使用什么来代替 bindparam 来搜索关键字?因为我是 PDO 的新手,所以我还在学习。因此,如果您有有效或更好的选择,请指出。
    • 哦,我删除了空格,但它显示的是no results found
    • 我,我使用准备好的语句,我只是更喜欢它们,个人喜好。至于它不返回任何结果,请检查 SQL 中是否存在错误:请参阅我上面的编辑。
    【解决方案2】:

    如果您使用 PDO 准备语句,则不必使用 mysql_real_escape_string()

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多