1

我正在用 PHP 和 MySQL 创建一个搜索脚本。现在,我已经达到了这样的程度,但在某些情况下它工作得不是很好:

$id = JRequest::getInt('id');
$catid = JRequest::getVar('catid');     
$console = JRequest::getVar('console'); 
$ram = JRequest::getVar('ram');

if ($ram) {
    $ram = "AND rec_ram='$ram'";
}       

if ($console) {
    $console = "AND console='$console'";
}

$array = array(
    catid => $catid,    
    console => $console,
    ram => $ram,
);

$db = JFactory::getDBO();
$query = "SELECT * FROM #__content WHERE catid='$catid' $array[console] $array[ram]";

有什么其他选择可以做到这一点?

有时值可能为空,这就是我使用的原因:

if ($console) {
    $console = "AND console='$console'";
}

但在某些情况下它仍然工作不好。

4

1 回答 1

1

使用串联!将所有变量都放在一个字符串中是非常糟糕的。

<?php

    $conditions = '';

    if ($ram) {
        $conditions .= ' AND `rec_ram`="'.$ram.'"';
    }       

    if ($console) {
        $conditions .= ' AND `console`="'.$console.'"';
    }

    $query = 'SELECT * FROM `#__content` WHERE `catid`=' . $catid . $condition . ';';

?>

请注意,如果 console 或 rec_ram 的类型为 int,则无需引用它的值。

<?php

    // column console is int 
    if ($console) {
        $conditions .= ' AND `console`='.$console;
    }

?>

好的,这是提供正确sql结构的方法:

$conditions = array();

if ($ram) {
    $conditions[] = '`rec_ram`="'.$ram.'"';
}

if ($console) {
    $conditions[] = '`console`="'.$console.'"';
}

// some other conditions...

$condition = '';
if (sizeof($conditions) > 0)
    $condition = ' WHERE ' . implode(' AND ', $conditions);

$query = 'SELECT * FROM `#__content`' . $condition . ';';
于 2012-12-01T10:11:56.743 回答