Преобразование PHP SQL в запрос Joomla SQL

Я перемещаю страницу PHP на свой сайт Joomla, и мне сообщили, что я "должен использовать стандарты кодирования и методы Joomla для всего, включая запросы к базе данных

Мой вопрос:

Как мне преобразовать старый код PHP в отношении стандартов Joomla:

$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. Я использую значения каждой строки в качестве переменных на моей странице.

 введите описание изображения здесь>> </a> </p>

<p> Обновлено 01.04.2016 --------------------- </p>

<p> <a href= введите описание изображения здесь>> </a> </p></body></html>

2 голоса | спросил Teodor Bochev 31 MarpmThu, 31 Mar 2016 22:34:08 +03002016-03-31T22:34:08+03:0010 2016, 22:34:08

2 ответа


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>';

Я бы серьезно предположил, что вы сохраните все имена столбцов таблицы как строчные. Иногда это может запутаться, когда вы начинаете заглавное слово или используете прописные буквы.

Если приведенный выше код не работает с предложениями where(), попробуйте заменить их на:

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

Надеюсь, что это поможет

ответил Lodder 31 MarpmThu, 31 Mar 2016 22:53:01 +03002016-03-31T22:53:01+03:0010 2016, 22:53:01
0

На основе снимка экрана таблицы базы данных ваши значения 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 значение для сокращения строк кода.
  • В моем фрагменте есть три возможных результата: 1. Покажите квалификационные строки. 2. Укажите, что строк не найдено. 3. Укажите, что была синтаксическая ошибка.
  • Если есть синтаксическая ошибка, я включил некоторые полезные вызовы, которые помогут вам отлаживать. Имейте в виду, что необработанный запрос и точное сообщение об ошибке никогда не должны публиковаться по соображениям безопасности.
ответил mickmackusa 11 J0000006Europe/Moscow 2018, 05:43:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132