it-swarm.com.de

Zeigen Sie einen Wert aus einem bestimmten DB-Feld an

Ich versuche herauszufinden, was ich hier vorhabe, was nicht funktioniert. Ich verwende RsTicketsPro und versuche, einen bestimmten Wert aus dem Abschnitt für benutzerdefinierte Felder in der Datenbank abzurufen. Ich habe mich an ihre Unterstützung gewandt und dies ist, was sie empfohlen haben:

$db = JFactory::getDBO();
$db->setQuery("SELECT `value` FROM #__rsticketspro_custom_fields_values WHERE `ticket_id`='".$item->id."' AND `custom_field_id`=7");
echo $db->loadResult();

Ok, also habe ich den Code so angepasst, dass er in eine Tabelle eingefügt wird, um diesen bestimmten Wert anzuzeigen:

<td align="center" class="rst_cell_assigned center">
<?php
$db = JFactory::getDBO();
$db->setQuery("SELECT 'value' FROM #__rsticketspro_custom_fields_values WHERE 'ticket_id'='".$item->id."' AND 'custom_field_id'=4");
echo $db->loadResult();
?>
</td>

Ich habe den benutzerdefinierten Feld-ID-Wert so aktualisiert, dass er mit dem entsprechenden Feld übereinstimmt, das ich aus meiner Datenbank abrufen möchte. Wenn ich es jedoch im Front-End ansehe, wird es nur leer angezeigt - keine Fehlermeldung oder etwas anderes.

Kennt jemand etwas, was ich falsch mache?

BEARBEITEN: AKTUELLER CODE IM ARBEITEN MIT

<?php
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(`value`);
$query->from($db->quoteName('#__rsticketspro_custom_fields_values'));
$query->where($db->quoteName(`ticket_id`)." = ".$db->quote('".$item->id."' AND `custom_field_id`=4"));
$db->setQuery($query);
$result = $db->loadResult();
echo $query;
echo $db->getErrorMsg();
?>

beachte , also lädt dieser jetzt nicht einmal mehr die Seite, haha. #Scheitern

Table being used

1
Brandon

Wenn dies ein Direktkopier-Einfügevorgang ist, tritt ein MySQL-Fehler auf:

SELECT 'value' FROM #__rsticketspro_custom_fields_values WHERE 'ticket_id'='".$item->id."' AND 'custom_field_id'=4

'value' Und 'ticket_id' Sollten mit einem Häkchen versehen sein, ohne Anführungszeichen.

Ich vermute, wenn Sie echo $db->getErrorMsg(); direkt nach echo $db->loadResult(); ausgeführt haben, würde es Ihnen mitteilen, dass ein MySql-Fehler vorliegt.

Können Sie im zweiten Teil, in dem Sie den Abfrage-Wrapper verwenden, die Ausgabe von echo $query; Veröffentlichen?

2
David Hayes

Ich vermute, dass das Problem auf das Fehlen von quoteName und einer ungültigen where-Anweisung zurückzuführen ist

sie sollten auch Verkettung verwenden (und qn alias für quoteName q für quote)

Dies sollte der richtige Weg sein, um Abfragen mit der Joomla Query Builder-Syntax durchzuführen

$db = JFactory::getDbo();

$query = $db->getQuery(true);
$query->select($db->qn('value'))
      ->from($db->qn('#__rsticketspro_custom_fields_values'))
      ->where($db->qn('ticket_id') . " = " . $db->q($item->id))
      ->where($db->qn('custom_field_id') . " = " . $db->q(4));
$db->setQuery($query);

$result = $db->loadResult();
4
Walt Sorensen

Ähhh! Ich habe es verstanden!!! Ich kehrte zum ursprünglichen Code zurück und konnte ihn zum Laufen bringen!

<?php
$db = JFactory::getDBO();
$db->setQuery("SELECT `value` FROM #__rsticketspro_custom_fields_values WHERE `ticket_id`='".$item->id."' AND `custom_field_id`=4");
$result = $db->loadResult();
echo $db->loadResult();
?>
1
Brandon

Joomlas PHP Coding Standards sagen:

Tabellennamen und Tabellenspaltennamen sollten immer in die quoteName () -Methode eingeschlossen werden, um den Tabellennamen und die Tabellenspalten zu umgehen. In einer Abfrage überprüfte Feldwerte sollten immer in die quote () - Methode eingeschlossen werden, um den Wert zu umgehen, bevor er an die Datenbank übergeben wird. Ganzzahlige Feldwerte, die in einer Abfrage überprüft wurden, sollten ebenfalls in (int) umgewandelt werden.

Wenn Sie zu oft in diese Zeile tippen, entsteht hässlicher und aufgeblähter Code, während Sie unnötigerweise Anführungszeichen aufrufen.

Da keiner der Tabellen- oder Spaltennamen in Anführungszeichen gesetzt werden muss und Sie Integer-Variablen als Integer-Typ umwandeln sollten, bevor Sie sie in die Abfrage schreiben, würde ich Folgendes empfehlen ...

* note value ist ein MySQL-Schlüsselwort, jedoch kein reserviertes Schlüsselwort. Daher ist kein Backticking erforderlich. https://dev.mysql.com/doc/refman/5.5/de/keywords.html#keywords-5-5-detailed-V

$db = JFactory::getDbo();
$query = $db->getQuery(true)
    ->select("value")
    ->from("#__rsticketspro_custom_fields_values")
    ->where([
        "ticket_id = " . (int)$item->id,
        "custom_field_id = 4"
    ]);
$db->setQuery($query);
$result = $db->loadResult();
  • die WHERE-Klausel freut sich über eine Reihe von Bedingungen
  • die Methodenverkettung kann mit der getQuery() -Methode beginnen, um das Schreiben von $query am Anfang jeder Zeile zu vermeiden
  • es macht keinen Sinn, den statischen Wert in Anführungszeichen zu setzen oder zu setzen 4

Das obige Snippet ist so sicher wie es geschrieben werden kann, während Joomlas Methoden zur Abfrageerstellung verwendet werden, ohne dass unnötige Zitataufrufe erforderlich sind.

1
mickmackusa