web-dev-qa-db-fra.com

La requête d'insertion ne fonctionne pas dans une boucle

J'essaie d'insérer des enregistrements dans une boucle. Mais incapable de le faire. Voici mon code:

historical.raw.php: créé une tâche dans le contrôleur de format brut

public function historical()
{
    $db = JFactory::getDBO();
    $arr =  array('ARI','ATL' );

    foreach ($arr as $key => $value) 
    {
        $query="INSERT INTO `tbname` (<columns>) VALUES (<values>)";
        $db->setQuery($query);
        $db->query(); 
        // or $db->execute();
    }
}

via URL, j'accède à la tâche mais elle me donne une erreur de 500. La boucle ne s'exécute qu'une fois. Dans la base de données, les lignes sont insérées uniquement pour la première valeur de tableau "ARI" et non pour la deuxième.

Lorsque je commente la ligne $db->query(), mon fichier s'exécute correctement sans erreur. Veuillez me guider correctement

Merci

3
user5491

J'ai résolu le problème. Voici mon code complet pour l'exécution de la requête:

<?php 
$arr =  array('ARI','ATL' );
$columns = array('col1','col2','col3');
$db = JFactory::getDbo();
foreach ($arr as $key => $value) 
{
$values = array($val1,$val2,$val3);
$query = $db->getQuery(true);
$query->insert($db->quoteName('#__tbname'))
      ->columns($db->quoteName($columns))
      ->values(implode(',', $db->quote($values)));
$db->setQuery($query);
$db->query();
}

La fonction implode doit être ajoutée car le $values Est un tableau et $db->quote($values) est nécessaire car il fournira des guillemets aux valeurs.

Merci à tous pour vos réponses et conseils

5
user5491

Cela peut être fait en utilisant -> insert () et -> values ​​(), avec le $ values étant un tableau des chaînes avec les colonnes à insérer.

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$columns = array('col_one','col_two');
$values = array();
// Proper escaping/quotes should be done here, and probably in a loop

foreach ($arr as $key => $value) {
    $values[] = '$key, $value';
}

$query->insert($db->quoteName('#__tablename'));
$query->columns($columns);
$query->values($values);
$db->setQuery($query);
$db->query();

J'espère que ça vous aidera :)

2
Joomler

Une table avec 100 colonnes ne doit pas être manipulée à la main. Dans la plupart des cas, on oublie quelque chose. Sur les modifications, votre tâche est ardue de trouver dans le code les positions

Fondamentalement, nous utilisons le formulaire JForm avec la définition de données correcte (validation) et un objet JTable connecté à la table. Cela évite beaucoup d’erreurs ;-)

<?php   
/** Example peace to get the Correct Columns**/
// Make sure, you have correct reflected and represented table columns
$existingColumns = array();
$table           = JTable::getInstance('TableFileName', 'Prefix');
$table->reset()
if ($table instanceof JTable) {
    $existingColumns = array_keys($table->getFields());
}
// we only want use this columns
$wantedColumns = array('col1', 'col2', 'col3');
/**
 * Working with checked and save existing columns
 **/
$arr = array('ARI', 'ATL');
// try this
$columns = $existingColumns;//array('col1', 'col2', 'col3');
// or this
$selectiveColumns = array();
foreach ($wantedColumns as $idx => $columnName) {
    if (in_array($columnName, $existingColumns, true)) {
        $selectiveColumns[] = $columnName;
    }
}

$db = JFactory::getDbo();
foreach ($arr as $key => $value) {

    $values = array($val1, $val2, $val3);

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

    $query->insert($db->quoteName('#__tbname'))
          ->columns($db->quoteName($columns))
        // or selective checked Columns
        //  ->columns($db->quoteName($selectiveColumns))
          ->values(implode(',', $db->quote($values)));

    $db->setQuery($query);
    try {
        $db->execute();
    } catch (Exception $e) {
        // for testing purposes let us know what happends
        var_dump($e->getMessage());
    }
}

// Alternate you can use save the JTable as it self
// generic data
$dataStack =
    array(
    array('col1' => 'data'),
    array('col1' => 'dataX'),
    array('col1' => 'dataY'));

$table = JTable::getInstance('TableFileName', 'Prefix');

foreach ($dataStack as $data) {
    $table->reset();
    $table->bind($data);
    $table->store();

}
1
JProof