Php 鸡及;在打印行中搜索时,打印行中的鸡蛋情况

Php 鸡及;在打印行中搜索时,打印行中的鸡蛋情况,php,database,search,Php,Database,Search,假设我有两个SQL表: QYZ: id, uid<user id, FK*>, somedatacolumn USERS: id<FK*>, name, surname 以下代码允许我搜索数据,但不允许搜索用户 请考虑以下代码: // index.php?q=Something // Note: the following could have been done through SQL, // but let's consider it wasn't (I'm wel

假设我有两个SQL表:

QYZ: id, uid<user id, FK*>, somedatacolumn
USERS: id<FK*>, name, surname
以下代码允许我搜索
数据
,但不允许搜索
用户

请考虑以下代码:

// index.php?q=Something
// Note: the following could have been done through SQL,
// but let's consider it wasn't (I'm well aware of the consequences).
$search=$_REQUEST['q'];
foreach($rows as $i=>$row){
    $found=false;
    foreach((array)$row as $k=>$v){
        if(stripos($v,$search)!==false){
            $found=true;
            break; // <- optimization
        }
    }
    if(!$found)unset($rows[$i]);
}

// And somewhere later on...
echo '<table>';
foreach($rows as $row){
    echo '<tr>';
    foreach((array)$row as $k=>$v){
        echo '<td>';
        echo formatter($row,$k,$v); // <- in truth, I'm using call_user_func(),
                               // but for the sake of argument...
        echo '</td>';
    }
    echo '</tr>';
}
echo '</table>';

// And maybe somewhere earlier, perhaps passed as a function argument...
function formatter($row,$column,$cell){
    switch($column){
        case 'uid':
            $cell=getUser($cell)->name().' '.getUser($cell)->surname();
    }
    return htmlspecialchars(''.$cell,ENT_QUOTES);
}
基本上,如果搜索查询匹配,我们将刷新缓冲区,否则,我们将清除缓冲区

虽然我认为它应该可以工作,甚至可能需要更少的CPU周期,但它听起来像是大量的内容操作

哦,仔细想想,去掉输出缓冲——如果我必须引入分页(我完全有这样做的意图),那就毫无意义了

看看问题在哪里?它需要操作/搜索生成的数据(搜索),以实际生成正确的数据。从几个方面来说,听起来效率非常低

PS:这很重要这个系统是通用的,这就是为什么我不能针对特定情况制定具体的系统

合乎逻辑的解决方案是在最后进行搜索(即在渲染行之后)

为什么??您的数据访问应该获得在一轮查询中选择行所需的所有信息。如果您使用的是数据库,您应该能够将表连接在一起。如果你不使用数据库,我会质疑这个决定

至于格式化/呈现,如果要显示的数据在结构上是同质的(每行相同),那么您应该能够在第一轮查询中获得所有这些。如果它在结构上是异构的,那么以后可能需要进行额外的查询


我强烈建议您尽可能将数据查询和渲染分离开来,否则您会遇到一个较大且难以维护的问题,而不是两个较小的问题。

我很难理解您的问题?@Finbarr-这主要是一个逻辑问题。恐怕你得把它读到底。:)我不知道我是否读错了,但第二个foreach似乎没有右括号-右括号没有对齐/这是故意的吗?@Christian。我从头到尾都在读,除了“问题”和“看问题在哪里?”(我不知道)你能说得更具体一点吗?我不确定您的问题是在搜索部分还是在格式化部分。也许你可以举个例子,上面第二个?您是对的,它实际上有一个额外的
{
(因为它只是一个if块).关于逻辑/数据编码,这主要是因为将其显示为一个测试用例。不过,您有一个很好的观点,您提到使用vs而不使用数据库,这就是问题所在。正如您所看到的,格式化例程连接了其他地方的内容。这可能是数据库,也可能不是数据库。正是这一点让我担心,PHP在查询方面很慢-我们都同意,将内容链接在一起并过滤掉是SQL的主要功能之一。啊哈,这实际上给了我一个想法。API开发人员不只是提供格式化例程,而是提供了两个:搜索例程和格式化例程。基本上,搜索例程将是后一个例程的一个精简版本,后者将一个块中的数据最适合搜索。
// index.php?q=Something
// Note: the following could have been done through SQL,
// but let's consider it wasn't (I'm well aware of the consequences).
$search=$_REQUEST['q'];
foreach($rows as $i=>$row){
    $found=false;
    foreach((array)$row as $k=>$v){
        if(stripos($v,$search)!==false){
            $found=true;
            break; // <- optimization
        }
    }
    if(!$found)unset($rows[$i]);
}

// And somewhere later on...
echo '<table>';
foreach($rows as $row){
    echo '<tr>';
    foreach((array)$row as $k=>$v){
        echo '<td>';
        echo formatter($row,$k,$v); // <- in truth, I'm using call_user_func(),
                               // but for the sake of argument...
        echo '</td>';
    }
    echo '</tr>';
}
echo '</table>';

// And maybe somewhere earlier, perhaps passed as a function argument...
function formatter($row,$column,$cell){
    switch($column){
        case 'uid':
            $cell=getUser($cell)->name().' '.getUser($cell)->surname();
    }
    return htmlspecialchars(''.$cell,ENT_QUOTES);
}
ob_start();
foreach($rows as $row){
    foreach((array)$row as $k=>$v){
        echo '<td>'.formatter($row,$k,$v).'</td>';
        stripos(strip_tags(ob_get_contents()),$search)!==false
            ? ob_flush() : ob_clean();
    }
}
ob_end_clean();