Php 使用“检索MYSQL字段数组”;例如;

Php 使用“检索MYSQL字段数组”;例如;,php,mysql,foreach,sql-like,Php,Mysql,Foreach,Sql Like,我有保存在mysql数据库中的页面,其中一个字段是每个页面的标签数组,希望能够帮助进行站点搜索 我收到一个由我的电话引起的错误 $results = $db->select('pages','','','name',array('name', 'DESC'),'10',array('tags', '%' .$word. '%')); (select的工作方式为--“表”、“where”、“where查询匹配的绑定”、“字段”、“orderby数组”、“限制”、“where/like数组”

我有保存在mysql数据库中的页面,其中一个字段是每个页面的标签数组,希望能够帮助进行站点搜索

我收到一个由我的电话引起的错误

$results = $db->select('pages','','','name',array('name', 'DESC'),'10',array('tags', '%' .$word. '%'));
(select的工作方式为--“表”、“where”、“where查询匹配的绑定”、“字段”、“orderby数组”、“限制”、“where/like数组”)

我认为问题在于“tags”字段是一个数组。最好的办法是什么?如有必要,我会在查询后将每个结果按原样拉出来:

//if we got something through $_POST
if (isset($_GET['search'])) {
// here you would normally include some database connection
require_once('../config/dbconfig.php');

// never trust what user wrote! We must ALWAYS sanitize user input
//$word = mysql_real_escape_string($_POST['search']);
$word = htmlentities($_GET['search']);
// build your search query to the database
//$sql = "SELECT title, url FROM pages WHERE content LIKE '%" . $word . "%' ORDER BY title LIMIT 10";

$results = $db->select('pages','','','*',array('name', 'DESC'),'10',array('tags', '%' .$word. '%'));

// get results
if (count($results) > 0) {
    $end_result = '';
    echo '<ul>';
    foreach($results as $row) {
        $bold = '<span class="found">' .$word. '</span>';
        $end_result .= '<li>' .str_ireplace($word, $bold, $row['title']).   '</li>';
    }
    //echo $end_result. '</ul>';
}else {
    //echo '<ul><li>No results found</li></ul>';
}
var_dump($results);
exit;
}
(切换到$_GetB/c,搜索使用AJAX,不想为了调用它而改变一堆东西,所以直接在页面中使用url。)


nm在我刚刚删除的查询编辑中,第一次是正确的。。。很抱歉…

一个问题是对非数组值使用了
count()

将非数组转换为数组时,它将成为包含原始值的单元素数组

(array) 1234; // results in array(0 => 1234)
(array) "ABC" // results in array(0 => "ABC")
(array) false // results in array(0 => false)
因此,当您执行
count($results)
时,
$results
false
时,该值将在内部转换为数组,您将得到
1
,因为它是一个单元素数组-处理结果的代码将运行,而不是
else
子句

这就是导致为foreach()提供的
无效参数的原因。
您看到的错误消息


至于为什么它会返回false,让我们来看看正在生成的查询:

SELECT name FROM pages ORDER BY name DESC WHERE tags LIKE %someword%
实际上这里有几个问题:

  • 你的单词值没有被引用。因此,查询将以以下内容结束:

    WHERE tags LIKE %someword%
    
    因此,一个错误是由
    %someword%
    周围缺少引号引起的

    我想这应该是
    select()
    函数的责任,同时还要对值进行转义以防止SQL注入,这也是缺少的

    最好的解决方案可能是让
    $like
    参数自动使用
    ,并添加到
    $bind
    值中。我假设
    $bind
    只是一个数组,所以您可以这样做:

    if (!empty($like)) {
        if (empty($bind)) $bind = array();
        $bind[] = $like[1];
        $sql .= " WHERE " .$like[0]. " LIKE ?"
    }
    
  • LIKE
    条件被添加到查询的末尾-在任何
    orderby
    LIMIT
    子句之后。这也会导致SQL无效。如果需要为
    $like
    添加额外参数,则应在处理现有
    $where
    条件的同时处理该参数,而不是在order by之后

  • 总的来说,我不明白为什么要对
    $like
    使用第7个参数,而不是将
    “tags like?”
    传递到现有的
    $where
    参数中


    与其猜测导致返回false的错误是什么,为什么不看看实际的错误消息呢

    您正在保存错误消息,然后返回false。。。因此,如果将此项添加到
    if
    条件的开头:

    if ($results === false) {
        echo($db->error);
    } elseif (count($results) > 0) {
    

    。。。您应该能够准确地看到PDO所抱怨的内容。

    标签字段是数组是什么意思?数组在MySQL中不是有效的列类型。另外,
    $db
    是什么类型的对象?我不熟悉任何有类似的
    select()
    方法的东西。术语可能是错误的,我正在使用的表中的一个字段名为“tags”,其值是:“about,mission,what,is,imengine,studio”。我想这只是一个带注释的字符串$db是用于启动与数据库连接的对象。使用非常讨厌的包装来保持连接。我确信
    $db
    可以很好地工作,但问题要么是传递给
    select()
    的参数,要么是它返回的对象,我对这两个都不熟悉。如果它是您自己的对象,您能提供更多关于它的详细信息吗?如果在调用
    select()
    之后执行
    var\u dump($results)
    ,您会得到什么?感谢您指出这一点,因为我以后会遇到问题。:)这不是我想的,改变了搜索,包括一些我知道会返回不止一个的内容,并改变为只提取所有记录,而不是只提取“名称”而仍然什么都没有。为like添加了额外的内容,但结果相同。老实说,这是一个非常好的观点,我不知道为什么我不把它放在WHERE lol中,无论哪种方式都会有同样的问题。在OP中也为查询添加了代码的运行部分,但我不认为它是包装器,因为它在新闻系统、登录/注销/注册、加载/编辑/添加页面等方面工作得很好。在这个查询中,一些特定的东西与记录中的“a、b、c、d”以及我认为仍然存在的东西有关,只是不知道是什么,因为我从来没有这样做过。哦,天哪。。。不,这就解决了问题。对此我真的很抱歉,但非常感谢!“真不敢相信我错过了。”格兰特很高兴我们能帮忙解决这个问题。我建议做一些事情来显示实际的PDO错误消息,可能还有实际的查询字符串,以帮助将来跟踪这类事情。目前,你似乎返回了false,并且没有在任何地方显示错误消息。是的,我刚刚恢复了这个。这在我的任务清单上。不过我真的应该先做。。。有点傻哈哈。
    if ($results === false) {
        echo($db->error);
    } elseif (count($results) > 0) {