web-dev-qa-db-fra.com

Les tentatives d'insertion de requêtes Joomla 3.x ne fonctionnent pas comme souhaité

Besoin d'un peu d'aide pour me signaler le problème. Je crée un composant et j'ai besoin d'insérer une ligne dans la base de données Joomla.

Cette ligne fonctionne, mais je dois créer le nom de la table moi-même et je préfère utiliser les fonctions intégrées de Joomla.

$config = JFactory::getConfig();
$dbprefix = $config->get('dbprefix');
$db_arr = array($dbprefix,'conquest_ctg_players');
$table_name = implode("",$db_arr);  

$sql = "INSERT INTO $table_name (id, ordering, state, checked_out, checked_out_time, created_by, modified_by, player_name, player_uuid, player_bann, player_level, player_xp, player_gold, resource_food, resource_supplys, resource_population, quest_energy, troops_basic, troops_advanced, jid)
          VALUES ('null', 1, '1', '0', '0000-00-00 00:00:00', '$userId', '$userId','$nUser', '$myuuid', '0', '1', '0', '50', '50', '50', '100', '100', '100', '0', '$userId')";

mais celui-ci se trompe:

$sql
->insert($db->quoteName('#__conquest_ctg_players'))
->columns($db->quoteName('id', 'ordering', 'state', 'checked_out', 'checked_out_time', 'created_by', 'modified_by', 'player_name', 'player_uuid', 'player_bann', 'player_level', 'player_xp', 'player_gold', 'resource_food', 'resource_supplys', 'resource_population', 'quest_energy', 'troops_basic', 'troops_advanced', 'jid'))
->values(null, 1, 1, 0, $db->quote('0000-00-00 00:00:00'), $userId, $userId,$nUser, $myuuid,0, 1, 0, 50, 50, 50, 100, 100, 100, 0, $userId);

L'erreur:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de 'AS ordering) VALUES ()' à la ligne 2

Celui-ci va créer une nouvelle entrée de table mais n'a aucune valeur.

$sql
->insert($db->quoteName('#__conquest_ctg_players'))
->columns(id, ordering, state, checked_out, checked_out_time, created_by, modified_by, player_name, player_uuid, player_bann, player_level, player_xp, player_gold, resource_food, resource_supplys, resource_population, quest_energy, troops_basic, troops_advanced, jid)
->values('null', '1', '1', '0', '0000-00-00 00:00:00', '$userId', '$userId','$nUser', '$myuuid', '0', '1', '0', '50', '50', '50', '100', '100', '100', '0', '$userId');

Si quelqu'un peut me dire pourquoi il pense qu'il ajoute une ligne, mais ne saisit pas d'informations, je lui en serais éternellement reconnaissant.

1
Christopher Cox
  1. #_ Vous évitera d'avoir à utiliser un préfixe littéral. Je vous recommande de l'utiliser de manière cohérente tout au long de votre projet.

  2. Votre première tentative d'utilisation de la syntaxe de création de requêtes de Joomla a échoué car $ db-> quoteName () accepte un maximum de deux paramètres. Vous en avez fourni ... beaucoup.

    $db->quoteName('id', 'ordering', 'state', ...)
    

    L'utilisation d'un tableau comme premier/seul paramètre vous aurait sauvé.

    $db->quoteName(['id', 'ordering', 'state', ...])
    
  3. Lorsque vous insérez une nouvelle ligne qui générera une nouvelle valeur auto-incrémentée et que vous nommez des colonnes, vous pouvez simplement omettre cette colonne et sa valeur null. Si vous remplissez CHAQUE colonne avec une valeur, vous pouvez également omettre complètement les noms de colonne.

  4. Quant aux méthodes de colonne et de valeur:

  5. Voir https://docs.joomla.org/Inserting,_Updating_and_Removing_data_using_JDatabase#Using_an_Object pour un exemple de syntaxe d'objet. Vous pouvez trouver cela plus facile à gérer.

1
mickmackusa

Désolé de perdre du temps mais je l'ai compris.

Cette façon a fonctionné

$columns = array('id', 'ordering', 'state', 'checked_out', 'checked_out_time', 'created_by', 'modified_by', 'player_name', 'player_uuid', 'player_bann', 'player_level', 'player_xp', 'player_gold', 'resource_food', 'resource_supplys', 'resource_population', 'quest_energy', 'troops_basic', 'troops_advanced', 'jid');
$values = array(0, 1, 1, 0, $db->quote('0000-00-00 00:00:00'), $userId, $userId,$db->quote($nUser), $db->quote($myuuid), 0, 1, 0, 50, 50, 50, 100, 100, 100, 0, $userId);
$sql
->insert($db->quoteName('#__conquest_ctg_players'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
0
Christopher Cox