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 に答える