web-dev-qa-db-fra.com

Afficher les données basées sur la clause multiple where?

J'apprécierais un peu d'aide avec ce qui suit.

J'ai deux customfields avec l'ID "6" et "7".

Je souhaite afficher customfield_value pour customfield (6), uniquement lorsqu'une condition spécifique pour customfield (7) est remplie. Donc, il ne doit afficher les données de customfield (6) que si customfield (7) a une certaine valeur.

Voici le code que j'ai écrit, mais cela ne fonctionne pas (me donne seulement vide lors du chargement des données):

<?php 

$db = JFactory::getDbo();

$query = $db->getQuery(true);

$query->select($db->quoteName(array('customfield_value', 'virtuemart_product_id', 'virtuemart_custom_id')));
$query->from($db->quoteName('jos_virtuemart_product_customfields'));
$query->where($db->quoteName('virtuemart_custom_id'). ' LIKE '. $db->quote('6'). ' AND '. $db->quoteName('customfield_value') . ' LIKE '. $db->quote('Frozen') . ' AND '. $db->quoteName('virtuemart_product_id'). 'LIKE ' . $db->quote($product->virtuemart_product_id));

$db->setQuery($query);

$results = $db->loadResult();
echo ($results);

 ?>

Voici mon code édité montrant le fonctionnement actuel de la table. Je n'ai inclus que 4 champs personnalisés, normalement il y en a environ 20:

<table style="font-size: 12.5px; width: 100%;" class="orders">
<tr style="border: 1px solid #ffb3b3;">
<th style="text-align:center;border: 1px solid #ffb3b3;">Local ICOS</th>
<th style="text-align:center;border: 1px solid #ffb3b3;">Description</th>
<th style="text-align:center;border: 1px solid #ffb3b3;">Batch ID</th>
<th style="text-align:center;border: 1px solid #ffb3b3;">Temp Zone</th>
</tr>

<?php
// Start the Output
foreach ( $this->products as $product ) {

    // Show the horizontal seperator
    if ($iBrowseCol == 1 && $iBrowseProduct > $BrowseProducts_per_row) { ?>
    <div class="horizontal-separator"></div>
    <?php }
?>

<tr style="border-bottom: 1px solid #ffb3b3; height: 30px; display:;">

<!-- ICOS -->
<td style="width: 80px;text-align: center;">
<?php 
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select($db->quoteName(array('customfield_value', 'virtuemart_product_id')));
$query->from($db->quoteName('jos_virtuemart_product_customfields'));
$query->where($db->quoteName('virtuemart_custom_id') . ' LIKE '. $db->quote('5'). ' AND '. $db->quoteName('virtuemart_product_id') . 'LIKE ' . $db->quote($product->virtuemart_product_id));

$db->setQuery($query);
$results = $db->loadResult();
echo ($results); 
 ?>
</td>

<!-- Description -->
<td style="padding-left: 10px;width: 300px; color: #ff3333;">
<?php  echo $product->product_name; ?>
</td>

<!-- BATCH ID (SKU) -->
<td style="width: 80px;text-align: center;">
<?php 
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select($db->quoteName(array('customfield_value', 'virtuemart_product_id')));
$query->from($db->quoteName('jos_virtuemart_product_customfields'));
$query->where($db->quoteName('virtuemart_custom_id') . ' LIKE '. $db->quote('6'). ' AND '. $db->quoteName('virtuemart_product_id') . 'LIKE ' . $db->quote($product->virtuemart_product_id));

$db->setQuery($query);
$results = $db->loadResult();
echo ($results); 
 ?>
</td>

<!-- Temp Zone -->
<td style="width: 80px;text-align: center;">
<?php 
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select($db->quoteName(array('customfield_value', 'virtuemart_product_id')));
$query->from($db->quoteName('jos_virtuemart_product_customfields'));
$query->where($db->quoteName('virtuemart_custom_id') . ' LIKE '. $db->quote('21'). ' AND '. $db->quoteName('virtuemart_product_id') . 'LIKE ' . $db->quote($product->virtuemart_product_id));

$db->setQuery($query);
$results = $db->loadResult();
echo ($results); 
 ?>
</td>
</tr>
<?php } ?>
</table>

D'accord. J'ai un menu déroulant avec "Frozen" en option. Lorsque je sélectionne "Frozen", seuls les produits avec la zone temporaire "Frozen" doivent être affichés. Dans chacun de ces cas, il me faudra mettre un morceau de code pour afficher les informations en fonction de la sélection déroulante.

1
MailBlade

Essayez ce qui suit, qui apporte quelques modifications à votre requête et devrait, espérons-le, imprimer quelques données pour vous:

$db = JFactory::getDbo();

$query = $db->getQuery(true)
    ->select($db->qn(array('customfield_value', 'virtuemart_product_id', 'virtuemart_custom_id')))
    ->from($db->qn('#__virtuemart_product_customfields'))
    ->where($db->qn('virtuemart_custom_id') . ' = ' . $db->q('6'))
    ->where($db->qn('customfield_value') . ' = ' . $db->q('Frozen'))
    ->where($db->qn('virtuemart_product_id') . '= ' . $db->q($product->virtuemart_product_id));
$db->setQuery($query);

$results = $db->loadObjectList();

var_dump($results);

Changements:

  • Définition correcte du nom de la table
  • Remplacez LIKE par = car vous n'essayez pas de faire correspondre quelque chose de similaire, mais quelque chose d'exact.
  • Utilisez loadObjectList lorsque vous appelez pour obtenir des données de plusieurs colonnes.
1
Lodder