搜索列以逗号分隔的字符串

时间:2014-11-09 21:33:24

标签: php mysql sql pdo

目前我正在使用下面的查询以及用于打印菜单的递归功能。

"SELECT * FROM categories WHERE FIND_IN_SET('".$parent."', parentId)"

数据库结构:  enter image description here

打印出来的结果是:

Smycken
--| Halsband
--|--| Guld
--|--|--| test
--|--|--|--| test2
--|--| Silver
--| Armband
Honung

第10行,parentId。我用逗号分隔了两个值(我已经读过这不是存储值的最终方式,但我还是会这样做),现在我想要将第10行打印出来一个子类别,就像我打印出的其他行一样。我找到的解决方案是使用FIND_IN_SET或使用LIKE,我没有按照自己的意愿工作......

我的问题的建议或解决方案?

这是我的功能:

function getSubCat($level = 0, $parent = 0)
{                                               


$hasChildren = false;
$outputHtml = '%s';
$childrenHtml = '';

$dbh = getdbh();

$getSubCategory = $dbh->prepare("SELECT * FROM categories WHERE FIND_IN_SET('".$parent."', parentId)");
$getSubCategory->execute();
$categories = $getSubCategory->fetchAll();
foreach($categories as $category)
{

    if ($category['parentId'] == $parent) {
        $hasChildren = true;
        $childrenHtml .= '<option value="'.$category['id'].'">';

        for($k = 0 ; $k < $level; $k++) {
            $childrenHtml .= '--|';
        }

        $childrenHtml .= ' '.$category['name'];
        $level++;
        $childrenHtml .= '</option>';
        $childrenHtml .= getSubCat($level, $category['id']);         
        $level--;                                                       
    }
}

if (!$hasChildren) {
    $outputHtml = '';
}

    return sprintf($outputHtml, $childrenHtml);
}

1 个答案:

答案 0 :(得分:1)

更改此行:

if ($category['parentId'] == $parent) {

为:

if (in_array($parent, explode(',', $category['parentId']))) {

==测试不会在逗号分隔的字符串中查找元素。

实际上,根本不需要这个if。 SQL中的WHERE子句已经保证$parent位于$category['parentId']