[RESOLU] récupérer nombre de champs identiques présents dans deux tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] récupérer nombre de champs identiques présents dans deux tables

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 09 nov. 2023, 23:10

j'ai remodifié le script ainsi croyant enfin atteindre mon but :P
if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
}
if (isset($_POST['jouer'] && count($_POST[n] >5))) {
echo "le nombre de cases à cocher est limité à 5";
}

    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
mais j'ai une autre erreur:
Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/clients/78f15c369c0786c4a419608e9e60028a/sites/idealworld.fr/lotoworld_tirage.php on line 22

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 09 nov. 2023, 21:57

if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
}
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
$nb=count($_POST['n']);
if($nb <= 5) {
$sql="INSERT INTO JEUX (name, city, pays, continent, n1, n2, n3, n4, n5) VALUES ('$pseudo', '$citoyen', '$residant', '$situation_continent', '{$cases_cochees[0]}','{$cases_cochees[1]}','{$cases_cochees[2]}','{$cases_cochees[3]}','{$cases_cochees[4]}');";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
c'st la requete

Re: récupérer nombre de champs identiques présents dans deux tables

par two3d » 09 nov. 2023, 11:02

Ya quoi à la ligne 28 de ton fichier /home/clients/78f15c369c0786c4a419608e9e60028a/... ?

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 09 nov. 2023, 10:48

if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
}
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
$nb=count($_POST['n']);
if($nb <= 5) {

Warning: Undefined array key 1 in /home/clients/78f15c369c0786c4a419608e9e60028a/ on line 28

Warning: Undefined array key 2 in /home/clients/78f15c369c0786c4a419608e9e60028a on line 28

Warning: Undefined array key 3 in /home/clients/78f15c369c0786c4a419608e9e60028a on line 28

Warning: Undefined array key 4 in /home/clients/78f15c369c0786c4a419608e9e60028a on line 28

Re: récupérer nombre de champs identiques présents dans deux tables

par two3d » 08 nov. 2023, 17:34

count() sur POST 'n', pas POST 'jouer'.

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 08 nov. 2023, 17:17

if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
}
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
$nb=count($_POST['jouer']);
if($nb<=5) {
bla bla bla...
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, string given in /home/clients/78f15c369c0786c4a419608e9e60028a/sites/xxxxr/lotoworld_tirage.php:24 Stack trace: #0 {main} thrown in /home/clients/78f15c369c0786c4a419608e9e60028a/sites/idealworld.fr/lotoworld_tirage.php on line 24

Re: récupérer nombre de champs identiques présents dans deux tables

par two3d » 08 nov. 2023, 11:00

Ligne 28 : clé inconnue. Tu essaye de lire une clé d'un tableau ($cases_cochees ?) qui n'est pas définie.

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 07 nov. 2023, 22:11

if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
$n=0;
}
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
	  $n++;
if($n<=5){
$sql="INSERT INTO JEUX (name, city, pays, continent, n1, n2, n3, n4, n5) VALUES ('$pseudo', '$citoyen', '$residant', '$situation_continent', '{$cases_cochees[0]}','{$cases_cochees[1]}','{$cases_cochees[2]}','{$cases_cochees[3]}','{$cases_cochees[4]}');";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
}
}
}
Warning: Undefined array key 1 in /home/clients/78f15c369c0786c4a419608e9e60028........
Warning: Undefined array key 2 in /home/clients/78f15c369c0786c4a419608e9e60028a...............
Warning: Undefined array key 3 in home/clients/78f15c369c0786c4a419608e9e60028a...on line 28
Warning: Undefined array key 4 in home/clients/78f15c369c0786c4a419608e9e60028a on line 28
Warning: Undefined array key 2 in home/clients/78f15c369c0786c4a419608e9e60028on line 28
Warning: Undefined array key 3 in home/clients/78f15c369c0786c4a419608e9e60028..on line 28

etc...

Re: récupérer nombre de champs identiques présents dans deux tables

par two3d » 07 nov. 2023, 17:58

Tu ajoute un itérateur à ta boucle foreach (avant ton foreach : $n = 0, puis dans le foreach, $n ++, puis tu vérifie si $n <= 5).

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 07 nov. 2023, 17:36

Bien, j'ai finalement viré LAST_INSERT ID() qui ne semblait pas fonctionner.
Ce que j'ai fait, c'est dans la foulée du résultat, et quelqu'il soit, je delete en table le pseudo qui vient de jouer.
Ainsi, aucune incohérence possible sachant aussi que le joueur ne peut faire qu'une grille par une grille.
Un dernier petit soucis, comment limiter le nombre de cases à cocher à 5?
if(isset($_POST['jouer'])){
  if(isset($_POST['n'])){
    $cases_cochees = [];
    foreach( $_POST['n'] as $valeur){
      $cases_cochees[] = $valeur;
    }
    
$sql="INSERT INTO JEUX (name, city, pays, continent, n1, n2, n3, n4, n5) VALUES ('$pseudo', '$citoyen', '$residant', '$situation_continent', '{$cases_cochees[0]}','{$cases_cochees[1]}','{$cases_cochees[2]}','{$cases_cochees[3]}','{$cases_cochees[4]}');";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();


.

Re: récupérer nombre de champs identiques présents dans deux tables

par two3d » 07 nov. 2023, 12:33

LAST_INSERT_ID()

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 07 nov. 2023, 12:29

Il y a un mieux, mais la requete va prendre tous les n s'il y a plusieurs jeux en table JEUX.
J'ai donc ciblé avec le pseudo, mais si le joueur fait plusieurs grilles, le résultat reste incohérent.
J'essaie de rajouter "lastInsertId() mais ça plante.
$sql="SELECT COUNT(*) AS nombre_colonnes_identiques FROM JEUX INNER JOIN TIRAGE ON JEUX.n1 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR JEUX.n2 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5) OR JEUX.n3 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR JEUX.n4 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5) OR JEUX.n5 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5) WHERE name='$pseudo' AND lastInsertId()";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
$row = $pdostat->fetch();
$resu = $row['nombre_colonnes_identiques']; 
echo $resu; 
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1370 execute command denied to user 'ub6k8_youe'@'%' for routine 'ub6k8_xxxx.lastInsertId' 

Re: récupérer nombre de champs identiques présents dans deux tables

par two3d » 07 nov. 2023, 10:18

Tu peux le faire avec une jointure sinon :
SELECT COUNT(*) AS nombre_colonnes_identiques
FROM JEUX
INNER JOIN TIRAGE ON 
JEUX.n1 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n2 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n3 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n4 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5)
OR 
JEUX.n5 IN (TIRAGE.t1, TIRAGE.t2, TIRAGE.t3, TIRAGE.t4, TIRAGE.t5);
Après tout dépends ta recherche, si tu vérifie si n1 est dans toutes les colonnes de TIRAGE ou seulement t1, la requête peut être simplifiée :
SELECT COUNT(*) AS nombre_colonnes_identiques FROM JEUX
WHERE 
  n1 IN (SELECT t1 FROM TIRAGE)
  OR n2 IN (SELECT t2 FROM TIRAGE)
  OR n3 IN (SELECT t3 FROM TIRAGE)
  OR n4 IN (SELECT t4 FROM TIRAGE)
  OR n5 IN (SELECT t5 FROM TIRAGE);

Re: récupérer nombre de champs identiques présents dans deux tables

par nestor94 » 07 nov. 2023, 09:58

Bonjour,

La solution de two3d affiche un message d'erreur:

Cardinality violation: 1241 Operand should contain 1 column(s)

Re: récupérer nombre de champs identiques présents dans deux tables

par ynx » 06 nov. 2023, 18:02

Pas sûr que la solution sql proposée puisse fonctionner car tu veux faire une intersection, l'utilisation de array_intersect semblait être une bonne piste :
<?php

$jeux = [
    ["n1" => 1, "n2" => 2, "n3" => 3, "n4" => 4, "n5" => 5],
    ["n1" => 2, "n2" => 8, "n3" => 20, "n4" => 25, "n5" => 30],
];

$tirages = [["t1" => 8, "t2" => 20, "t3" => 30, "t4" => 31, "t5" => 40]];

foreach ($tirages as $tirage) {
    foreach ($jeux as $jeu) {
        echo "tirage : " . implode(",", $tirage) . "\n";
        echo "jeu : " . implode(",", $jeu) . "\n";

        $intersect = array_intersect($tirage, $jeu);

        echo "count intersect : " . count($intersect) . "\n";

        if (count($intersect) > 0) {
            echo "intersect : " . implode(",", $intersect) . "\n";
        }

        echo "\n";
    }
}
Affiche :
tirage : 8,20,30,31,40
jeu : 1,2,3,4,5
count intersect : 0

tirage : 8,20,30,31,40
jeu : 2,8,20,25,30
count intersect : 3
intersect : 8,20,30