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の内容です。各行の値をページの変数として使用しています。
2016年4月1日更新---------------------
おそらく次のようなものです:
_$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.'%'));
_
お役に立てれば
データベーステーブルのスクリーンショットに基づくと、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
を使用するのではなく、それぞれfloat
とint
を使用して制限を厳しくします。次に、値は十分に無害化され、変数の補間によってクエリで使用されます。<table>
_の内部では、_try {} catch {}
_ブロックを使用しています。これは、クエリプロセス中に発生する可能性のあるエラーを処理するクリーンで読み取り可能な方法だからです。select()
メソッドでは、 末尾のゼロを削除 をPower
から(表示時ではなく)変更し、TYPE
の大文字と小文字を他の列と一致します(個人的な好み)。$db->qn()
($db->quoteName()
の省略形)がテーブル名で呼び出されます。これは、テーブル名にスペースが含まれているためにのみ必要です。スペースがない場合は、バッククォートの引用を省略できます。LIKE
演算子を使用しないでください。 _=
_はうまく機能します。 _$power
_および_$poles
_の値は必ず数値であるため、一重引用符で囲む必要はありません。!$results = ...
_式は、結果セットを変数に宣言すると同時に、false-y値をチェックしてコード行を減らします。