it-swarm-eu.dev

Trasforma PHP SQL in query Joomla SQL

Sto spostando una PHP sul mio sito Web Joomla e mi è stato consigliato che io "dovrei usare gli standard e i metodi di codifica di Joomla per tutto, questo include query di database "

La mia domanda è:

Come dovrei trasformare il mio vecchio PHP relativo agli standard 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>';

?>  

Questo è il contenuto della TABELLA 2. Uso i valori di ogni riga come variabili sulla mia pagina.

enter image description here

Aggiornato 01.04.2016 ---------------------

enter image description here

2
Teodor Bochev

Forse qualcosa di simile al seguente:

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

Suggerirei seriamente di mantenere tutti i nomi delle colonne della tabella in minuscolo. A volte può diventare fonte di confusione quando si inizia a scrivere in maiuscolo o in maiuscolo.

Se il codice sopra riportato non funziona con le clausole where(), prova a sostituirle con:

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

Spero che sia di aiuto

1
Lodder

In base alla schermata della tabella del database, i valori Power sono di tipo (float) E i valori Poles di tipo (int). Per questo motivo, puoi essere più restrittivo in processo di convalida dell'input dell'utente .

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

Ora per l'output tabulare:

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

Spiegazioni:

  • Anziché utilizzare RAW come parametro del filtro durante la raccolta dei valori inviati, restringere le restrizioni utilizzando rispettivamente float e int. Quindi i tuoi valori sono sufficientemente igienizzati per essere utilizzati nella query tramite interpolazione variabile.
  • All'interno del tuo <table>, Sto impiegando un blocco try {} catch {} Perché è un modo pulito/leggibile di gestire gli errori che possono verificarsi durante il processo di interrogazione.
  • Nel metodo select(), sono rimuovendo gli zeri finali da Power (anziché al momento della visualizzazione) e cambiando il case di TYPE in conforme alle altre colonne (preferenza personale).
  • $db->qn() (abbreviazione di $db->quoteName()) viene chiamato sul nome della tabella; questo è necessario solo perché il nome della tabella contiene uno spazio. Se non ci fosse spazio, la quotazione del backtick potrebbe essere omessa.
  • Poiché stai cercando corrispondenze esatte di valore nelle due colonne nominate, non dovresti utilizzare l'operatore LIKE più costoso; = Andrà bene. Poiché i valori $power E $poles Sono sicuramente numerici, non è necessario che siano tra virgolette singole.
  • L'espressione !$results = ... Sta entrambi dichiarando il set di risultati in una variabile e verificandone il valore false-y per ridurre le righe di codice.
  • Esistono tre possibili esiti nel mio frammento: 1. Mostra le righe qualificanti. 2. Dichiarare che non sono state trovate righe 3. Dichiarare che si è verificato un errore di sintassi.
  • Se si verifica un errore di sintassi, ho incluso alcune chiamate utili che ti aiuteranno a eseguire il debug. Tieni presente che la query non elaborata e il messaggio di errore esatto non devono mai essere resi pubblici per motivi di sicurezza.
0
mickmackusa