web-dev-qa-db-ja.com

変換PHP SQLからJoomla SQLクエリへ

PHPページをJoomla Webサイトに移動しています。私は "Joomlaのコーディング標準と方法を使用する必要があるとアドバイスされましたすべて、これにはデータベースクエリが含まれます "

私の質問は:

Joomla標準に関する私の古いPHPコードをどのように変換するべきですか:

$query = "SELECT * FROM `TABLE 2` WHERE Power LIKE ".$input->get('Power', '', 'RAW')." AND Poles LIKE ".$input->get('Poles', '', 'RAW')."";

$results = mysql_query($query)
or die(mysql_error());

echo '<table class="table table-striped">';
echo '<tr><th>Тип по БДС IEC 60034</th><th>Мощност</th><th>Обороти</th><th>Тегло</th></tr>';
while ($row = mysql_fetch_array($results)) 
{
extract($row);


echo '<tr><td class="first">Електромотор тип '.$TYPE.'</td><td>'.($Power+0).' kW</td><td>'.$Speed.' мин.<sup>-1</sup></td><td>'.$Weight.' кг.</td></tr>';
}
echo '</table>';

?>  

これは表2の内容です。各行の値をページの変数として使用しています。

enter image description here

2016年4月1日更新---------------------

enter image description here

2
Teodor Bochev

おそらく次のようなものです:

_$db = JFactory::getDbo();

$poles = $input->get('Poles', '', 'RAW');
$power = $input->get('Power', '', 'RAW');

$query = $db->getQuery(true);     
$query->select($db->quoteName(array('*')))
      ->from($db->quoteName('TABLE 2'))
      ->where($db->quoteName('Power') . ' LIKE ' . $db->quote($power))
      ->where($db->quoteName('Poles') . ' LIKE ' . $db->quote($poles));
$db->setQuery($query);

$results = $db->loadObjectList();

echo '<table>';

foreach ($results as $row)
{
    echo '<tr>';
    echo '<td class="first">Електромотор тип ' . $row->TYPE . '</td>';
    echo '<td>' . ($row->Power+0) . ' kW</td>';
    echo '<td>' . $row->Speed . ' мин.<sup>-1</sup></td>';
    echo '<td>' . $row->Weight . ' кг.</td>';
    echo '</tr>';
}

echo '</table>';
_

ただし、テーブルの列名はすべて小文字のままにすることを強くお勧めします。 Wordを大文字にしたり、大文字を使用したりすると、混乱することがあります。

上記のコードがwhere()句で機能しない場合は、次のコードに置き換えてください。

_->where($db->quoteName('Power') . ' LIKE ' . $db->quote('%'.$power.'%'))
->where($db->quoteName('Poles') . ' LIKE ' . $db->quote('%'.$poles.'%'));
_

お役に立てれば

1
Lodder

データベーステーブルのスクリーンショットに基づくと、Power値は_(float)_タイプであり、Poles値は_(int)_タイプです。このため、 ユーザー入力の検証プロセス をより制限することができます。

_$jinput = JFactory::getApplication()->input;
$power = $jinput->get('Power', '', 'float');  // sufficiently sanitize for querying
$poles = $jinput->get('Poles', '', 'int');    // sufficiently sanitize for querying

echo "<div>Резултати за мощност = $power & поляците = $poles</div>"; // Results for...
_

次は表形式の出力です。

_echo "<table class=\"table table-striped\">";
    $db = JFactory::getDBO();
    try {
        $query = $db->getQuery(true)
                    ->select("TYPE AS Type, TRIM(Power) + 0 AS Power, Speed, Weight")
                    ->from($db->qn("TABLE 2"))
                    ->where("Power = $power AND Poles = $poles);
        $db->setQuery($query);
        if (!$results = $db->loadAssocList()) {
            echo "<tr><td>Няма резултати</td></tr>";  // No Results
        } else {
            echo "<tr>";
                echo "<th>Тип по БДС IEC 60034</th>";
                echo "<th>Мощност</th>";
                echo "<th>Обороти</th>";
                echo "<th>Тегло</th>";
             echo "</tr>";
             foreach ($results as $row) {
                 echo "<tr>";
                     echo "<td class=\"first\">Електромотор тип {$row['Type']}</td>";
                     echo "<td>{$row['Power']} kW</td>";
                     echo "<td>{$row['Speed']} мин.<sup>-1</sup></td>";
                     echo "<td>{$row['Weight']} кг.</td>";
                 echo "</tr>";
             }
        }
    } catch (Exception $e) {
        echo "<tr><th>Query Syntax Error - Please notify developer</th></tr>";
        /*
        echo "<tr><th>DO NOT MAKE THESE DETAILS PUBLIC:";
            echo "<div>Query: " . $query->dump() . "</div>";
            echo "<div>Error: " . $e->getMessage() . "</div>";
        echo "</th></tr>";
        */
    }
echo "</table>";
_

説明:

  • 送信された値を収集するときにフィルターパラメーターとしてRAWを使用するのではなく、それぞれfloatintを使用して制限を厳しくします。次に、値は十分に無害化され、変数の補間によってクエリで使用されます。
  • _<table>_の内部では、_try {} catch {}_ブロックを使用しています。これは、クエリプロセス中に発生する可能性のあるエラーを処理するクリーンで読み取り可能な方法だからです。
  • select()メソッドでは、 末尾のゼロを削除Powerから(表示時ではなく)変更し、TYPEの大文字と小文字を他の列と一致します(個人的な好み)。
  • $db->qn()$db->quoteName()の省略形)がテーブル名で呼び出されます。これは、テーブル名にスペースが含まれているためにのみ必要です。スペースがない場合は、バッククォートの引用を省略できます。
  • 指定した2つの列で完全に一致する値を探すため、より高価なLIKE演算子を使用しないでください。 _=_はうまく機能します。 _$power_および_$poles_の値は必ず数値であるため、一重引用符で囲む必要はありません。
  • _!$results = ..._式は、結果セットを変数に宣言すると同時に、false-y値をチェックしてコード行を減らします。
  • 私のスニペットには、3つの可能な結果があります。1.条件を満たす行を表示します。 2.行が見つからないことを示します。3.構文エラーがあったことを示します。
  • 構文エラーがある場合、デバッグに役立ついくつかの便利な呼び出しを含めました。未加工のクエリと正確なエラーメッセージは、セキュリティ上の理由から決して公開しないでください。
0
mickmackusa