Php 使用“检索MYSQL字段数组”;例如;
我有保存在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数组”
$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) {