web-dev-qa-db-fra.com

Transformer PHP Requête SQL en Joomla SQL

Je déplace une page PHP] vers mon site Web Joomla et on m'a informé que je "devrais utiliser les normes et méthodes de codage de Joomla pour tout, ce inclut les requêtes de base de données "

Ma question est:

Comment devrais-je transformer mon ancien code PHP concernant les normes 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>';

?>  

Ceci est le contenu du TABLEAU 2. J'utilise les valeurs de chaque ligne en tant que variables sur ma page.

enter image description here

Mis à jour le 01.04.2016 ---------------------

enter image description here

2
Teodor Bochev

Peut-être quelque chose comme ce qui suit:

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

Je suggérerais sérieusement cependant que vous gardiez tous les noms de colonne de votre table en minuscules. Cela peut parfois devenir déroutant lorsque vous commencez à capitaliser Word ou à utiliser des majuscules.

Si le code ci-dessus ne fonctionne pas avec les clauses where(), essayez de les remplacer par:

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

J'espère que cela t'aides

1
Lodder

Selon la capture d'écran de votre table de base de données, vos valeurs Power sont de type (float) Et vos valeurs Poles de type (int). Pour cette raison, vous pouvez être plus restrictif dans le processus de validation de votre saisie utilisateur .

$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...

Passons maintenant à la sortie tablulaire:

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

Explications:

  • Plutôt que d'utiliser RAW comme paramètre de filtre lors de la collecte des valeurs soumises, resserrez les restrictions en utilisant respectivement float et int. Ensuite, vos valeurs sont suffisamment vérifiées pour être utilisées dans la requête via une interpolation variable.
  • À l’intérieur de votre <table>, J’utilise un bloc try {} catch {} Car c’est un moyen propre et lisible de traiter les erreurs pouvant survenir pendant le processus d’interrogation.
  • Dans la méthode select(), je suis en supprimant les zéros de fin de Power (plutôt qu'au moment de l'affichage) et en modifiant la casse de TYPE pour qu'elle soit conforme avec les autres colonnes (préférence personnelle).
  • $db->qn() (le raccourci pour $db->quoteName()) est appelé dans le nom de la table; cela n'est nécessaire que parce que le nom de la table contient un espace. S'il n'y avait pas d'espace, la citation en arrière pourrait être omise.
  • Comme vous recherchez des correspondances exactes sur les valeurs des deux colonnes désignées, vous ne devez pas utiliser l’opérateur plus coûteux LIKE; = Fera l'affaire. Parce que vos valeurs $power Et $poles Sont sûrement numériques, elles n'ont pas besoin d'être entre guillemets simples.
  • L'expression !$results = ... Permet à la fois de déclarer le résultat en une variable et de rechercher une valeur false-y pour réduire les lignes de code.
  • Mon extrait contient trois résultats possibles: 1. Affichez les lignes de qualification. 2. Indiquez qu'aucune ligne n'a été trouvée. 3. Indiquez qu'il y a eu une erreur de syntaxe.
  • S'il y a une erreur de syntaxe, j'ai inclus quelques appels utiles qui vous aideront à déboguer. N'oubliez pas que la requête brute et le message d'erreur exact ne doivent jamais être rendus publics pour des raisons de sécurité.
0
mickmackusa