web-dev-qa-db-fra.com

Afficher une valeur d'un champ de base de données spécifique

J'essaie de comprendre ce qui ne va pas ici. J'utilise RsTicketsPro et j'essaie d'extraire une valeur spécifique de la section des champs personnalisés de la base de données. J'ai sollicité leur soutien et voici ce qu'ils ont recommandé:

$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, j'ai donc ajusté leur code pour le mettre en place dans un tableau afin d'afficher cette valeur spécifique:

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

J'ai mis à jour la valeur de l'ID de champ personnalisé afin qu'elle corresponde au champ correspondant que je veux extraire de ma base de données, mais lorsque je le visualise au premier plan, il n'affiche que rien - aucun message d'erreur ni rien.

Quelqu'un voit quelque chose que je fais mal?

EDIT: CODE ACTUEL IM TRAVAILLANT AVEC

<?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();
?>

note donc celui-ci ne charge même plus la page, haha. #échouer

Table being used

1
Brandon

S'il s'agit d'un copier-coller direct, vous avez une erreur mysql:

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

'value' Et 'ticket_id' Devraient avoir des ticks en retour et non des guillemets.

Je suppose que si vous exécutiez echo $db->getErrorMsg(); juste après echo $db->loadResult();, cela indiquerait une erreur MySql.

Sur la 2e partie où vous utilisez le wrapper de requête, pouvez-vous poster le résultat de echo $query;?

2
David Hayes

Je soupçonne que le problème est dû à votre déclaration sélectionnée manquant quoteName et à une déclaration où la déclaration a

vous devez également utiliser chaining (et qn alias pour quoteName q pour quote)

Cela devrait être la bonne façon de faire des requêtes en utilisant la syntaxe du constructeur de requêtes Joomla

$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

Ahhh! J? ai compris!!! Je suis revenu au code original et j'ai pu le faire fonctionner correctement!

<?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

Joomla's PHP Les normes de codage disent:

Les noms de table et les noms de colonne de table doivent toujours être inclus dans la méthode quoteName afin d'échapper au nom de la table et aux colonnes de la table. Les valeurs de champ cochées dans une requête doivent toujours être incluses dans la méthode quote () afin d'échapper à la valeur avant de la transmettre à la base de données. Les valeurs de champ entier vérifiées dans une requête doivent également être transtypées en (int).

Trop souvent, cette ligne génère du code laid et gonflé, tout en appelant inutilement des méthodes de citation.

Comme aucun des noms de table ou de colonne n'a réellement besoin de guillemets et que vous devez convertir les variables entières en tant que type entier avant de les écrire dans la requête, voici ce que je recommanderais ...

* note value est un mot clé MySQL, mais pas un mot clé réservé. Il ne nécessite donc pas de rétrogradation. https://dev.mysql.com/doc/refman/5.5/en/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();
  • la clause WHERE est heureuse de recevoir un tableau de conditions
  • le chaînage de méthode peut commencer à partir de la méthode getQuery() pour éviter d'écrire $query au début de chaque ligne
  • il est inutile de citer ou de convertir la valeur statique 4

L'extrait de code ci-dessus est aussi sécurisé qu'il peut être écrit en utilisant les méthodes de construction de requêtes de Joomla sans citer inutilement les appels.

1
mickmackusa