IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

variable non prise en compte dans un INSERT php mysql


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut variable non prise en compte dans un INSERT php mysql
    Bonjour
    j'ai un problème de varible voici mon code expliqué:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <script type="text/javascript">
     
    function resolution() {
     
      document.location="<?php echo $_SERVER['PHP_SELF']; ?>?width="+screen.width+"&height="+screen.height;
     
    }
     
    </script>
     
    <?php
     
    if(!isset($_GET['width']) and !isset($_GET['height'])){
        echo "<script> resolution();</script>";
        }else{
     
        $data = $_GET['width'] . '*' . $_GET['height'];
      }
     
    $pdo = new PDO('mysql:host=ip;dbname=db', 'id', '****');
     
    $ip =  $_SERVER['REMOTE_ADDR'];
     
    $trik = $pdo -> prepare("SELECT * FROM conf");
    $trik-> execute();
    $pluk = $trik -> fetchAll();
     
    $tem = 0;
    //temoin a zero
     
    foreach ($pluk as $ray){
     
     
     
      if($ray['ip']==$ip){
     
    //si l'ip est deja dans la base :
    	$tem=1;
    //sinon $tem = 0 pour inserer la base
        }
    }
     
    //ma reolution s'affiche
    echo $data; 
     
    if ($tem==0){
     
    	$trok = $pdo -> prepare("INSERT INTO conf (ip, reso) VALUES ('$ip', '$data')");
        $trok-> execute();
    //$data n'est pas prise en compte alors que sip, si
          }
    ?>
    Que feriez-vous pour $data soit prise en compte ?

    ma table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [CREATE TABLE `conf` (
      `ip` varchar(255) NOT NULL,
      `reso` varchar(255) NOT NULL,
      `id` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
     
    --
    -- Déchargement des données de la table `conf`
    --
     
    INSERT INTO `conf` (`ip`, `reso`, `id`) VALUES
    ('192.168.1.1', '234*345', 1),
    ('2a01:cb08:840e:f100:694a:df91:5654:2891', '1024*600', 2),  //ma résolution est répertoriée
    ('175.24.214.104', '', 3);   // toutes les autres sont nuls

  2. #2
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Bonjour,

    en effet votre code ne peut pas fonctionner comme vous semblez l'imaginer.

    Dans votre code, au premier affichage de la page,
    le script insère une ligne alors que le script ne connait pas déjà la résolution.
    Le script provoque une redirection côté client, via une fonction javascript.
    Lors de se second affichage, le script n’insérera pas la nouvelle ligne
    car une ligne avec cette ip existe déjà.

    Il me semble que vous tentez de faire de l'analytics, à confirmer,
    si tel est le cas, je ne saurais trop vous conseiller de vous tourner
    vers une solution open source.

    Autrement, quel que soit le besoin, il serait préférable de passer
    par une requête asynchrone javascript pour appeler le script
    d'insertion des informations.

    Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <script type="text/javascript">
    function resolution() {
      document.location="<?php echo $_SERVER['PHP_SELF']; ?>?width="+screen.width+"&height="+screen.height;
    }
    </script>
    Vous auriez quelque chose tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    var img = document.createElement("img");
    img.style.width="1px";
    img.style.height="1px";
    document.body.appendChild(img);
    img.src="/script pour insérer?width="+screen.width+"&height="+screen.height; 
    </script>
    Il est possible d'utiliser, à minima, les cookies de session pour éviter de multiples appels intempestif.

    Après il faut prendre garde à la valeur de $_SERVER['REMOTE_ADDR'] qui n'est pas de confiance.

    Il faudra aussi apprendre à utiliser des paramètres de requête sql, plutôt que de l'interpolation de variables.

    Finalement, il faut prendre le temps d'apprendre les possibilités offerte par SQL, notamment la fonction COUNT.

    tout un programme.

    Bonne journée.

  3. #3
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut
    j'ai choisi la possibilité d'une image contre sa source pour avoir les valeurs dans l'url d'une manière asynchrone mais je ne comprend pas pourquoi ça ne fonctionne pas
    voici mon code :
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <script type="text/javascript">
    var img = document.createElement("img");
    img.style.width="1px";
    img.style.height="1px";
    document.body.appendChild(img);
    img.src="?width="+screen.width+"&height="+screen.height; 
    </script>
    <html>
    	<head>
        </head>
        <body>
     
    <?php 
       function get_ip_address() {
            if ( isset( $_SERVER['HTTP_X_REAL_IP'] ) ) {
               
             $ip= $_SERVER['HTTP_X_REAL_IP'];
           
             } elseif ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
                // Proxy servers can send through this header like this: X-Forwarded-For: client1, proxy1, proxy2
               
              $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];  // Make sure we always only send through the first IP in the list which should always be the client IP.
           
             } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
               
              $ip =$_SERVER['REMOTE_ADDR'];
          
            }
    global $ip;
      }
       get_ip_address();
     
    if(isset($_GET['width']) and isset($_GET['height'])){
     
        $data = $_GET['width'] . '*' . $_GET['height'];
     
        } else { 
     
            echo "nodata";
     
        }
     
    echo $ip." ".$data;
     
    ?>
    </body><html>
    Pouvez-vous m'éclairer ?

  4. #4
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Oui. En partant du principe qu'on démarre depuis http://le9emecercle.net/

    Vous vous assurez que ce bout de code JS est bien présent en bas de chaque page,
    dans la mesure où l'on souhaite un tracking exhaustif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    var img = document.createElement("img");
    img.style.width="1px";
    img.style.height="1px";
    document.body.appendChild(img);
    img.src="/analytics.php?width="+screen.width+"&height="+screen.height; 
    </script>
    Vous allez rajouter un script analytics.php à la racine du site.

    Dans ce script, vous allez y mettre les instructions pour logger les paramètres d'affichage et d'ip.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <?php 
    session_cache_limiter('nocache');
     
    function get_ip_address() {
    	$ip = "";
    	$keys = ['HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'];
    	foreach( $keys as $key) {
    		if ( isset($_SERVER[$key]) ) {
    			$x = current(explode(",",$_SERVER[$key], 10));
    			$x = trim($x):
    			if(inet_pton($x)!==false) {
    				$ip = $x;
    				break;
    			}
    		}
    	}
    	return $ip;
    }
     
    $ip = get_ip_address();
     
    $data = "";
    if(isset($_GET['width']) && isset($_GET['height'])){
    	if (is_numeric($_GET['width']) && is_numeric($_GET['height'])) {
    		$data = $_GET['width'] . '*' . $_GET['height'];
    	}
    }
     
    if(strlen($ip)<1 || strlen($data)<1 {
    	exit;
    }
     
    $pdo = new PDO('mysql:host=ip;dbname=db', 'id', '****');
     
    $exists_query = $pdo->prepare("SELECT COUNT(ip) FROM conf WHERE ip=:ip");
    $ok = $exists_query->execute(['ip' => $ip]);
    if($ok===false) {
    	error_log("failed to select conf: {$exists_query->errorCode()} {$exists_query->errorInfo()}");
    	exit;
    }
    $exists_row = $exists_query->fetchAll();
    $exists = $exists_row[0][0]>0;
     
    if($exists) {
    	exit;
    }
     
    $insert_query = $pdo->prepare("INSERT INTO conf (ip, reso) VALUES (:ip, :data)");
    $ok = $insert_query->execute(['ip' => $ip, 'data'=>$data]);
    if($ok===false) {
    	error_log("failed to insert conf: {$insert_query->errorCode()} {$insert_query->errorInfo()}");
    	exit;
    }
    Je ne comprends pas trop cette table conf, mais bon, il me semble que les lignes devraient avoir une notion d'horodatage.

    Deux petites remarques au passage, dans view-source:http://le9emecercle.net/ Il y a un </head> perdu tel que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    </body>
      </head>
    </html>
    Vous avez mis une règle tel que width: 980; sur le body, il me semble que ce serait plus approprié de le mettre sur le .wrapper.

    * Notez que je ne l'ai pas testé, il y a probablement des coquilles.

    Bonne journée.

  5. #5
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut
    Encore merci

    Pour la table conf, elle me permet d'avoir des notions pour les configurations des mobile afin que la site soit adapté à toutes

  6. #6
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Vous pouvez utiliser ces références pour définir vos breakpoints css

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Breakpoint                Keyword        Dimension
    Small                          sm                  ≥576px
    Medium                    md                  ≥768px
    Large                          lg                    ≥992px
    Extra large                 xl                    ≥1200px
    Extra extra large       xxl                  ≥1400px
    Il y a peut être d'autres avis sur le sujet, vous pourrez toujours le corriger plus tard.

    Bonne journée.

  7. #7
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut
    merci beaucoup pour cette aide unanonyme, tout fonctionne des petits : pour ; et une ) manquante rien de grave, merci

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 549
    Billets dans le blog
    10
    Par défaut
    bonjour,

    Attention : en ligne 24 de votre code (1er post) vous utilisez SELECT *, c'est risqué

    Voyez l'article de mon blog ici à ce sujet

    Par ailleurs, pensez à passer le sujet à "résolu" si c'est bien le cas .

  9. #9
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Citation Envoyé par zool.bzh Voir le message
    merci beaucoup pour cette aide unanonyme, tout fonctionne des petits : pour ; et une ) manquante rien de grave, merci
    Bonjour,

    Je ré affirme que vous devriez utiliser des breakpoints CSS.
    Est ce qu'on aurait oublié de vous en expliquer l'utilité ?

    Et si vous tenez vraiment à faire de l'analytics, il y a encore du travail.
    Je me suis contenté de reproduire votre proposition sans y apporter d'éléments,
    en l'état ce n'est pas ok en regard de ce que j'avais compris de votre besoin.

    Finalement, oui désolé pour ma syntaxe PHP, j'ai pris d'autres habitude avec d'autres langages.

    Prenez le temps de lire la suggestion d'escartefigue.

    Bonne journée.

  10. #10
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut
    Salut les gars

    ok pour le SELECT je préciserais ma colonne de bdd au lieu du *

    Pour le script unanonyme c'est juste pour avoir une idée de résolution max d'un mobile que j'optimiserais avec du flex rien de plus.

    Voila tous

  11. #11
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut
    Je déterre ce post pour te dire, unanonyme que ton script n'inscrit que mes infos et pas un seul internautes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php 
    session_cache_limiter('nocache');
     
    function get_ip_address() {
    	$ip = "";
    	$keys = ['HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'];
    	foreach( $keys as $key) {
    		if ( isset($_SERVER[$key]) ) {
    			$x = current(explode(",",$_SERVER[$key], 10));
    			$x = trim($x):
    			if(inet_pton($x)!==false) {
    				$ip = $x;
    				break;
    			}
    		}
    	}
    	return $ip;
    }
     
    $ip = get_ip_address();
     
    $data = "";
    if(isset($_GET['width']) && isset($_GET['height'])){
    	if (is_numeric($_GET['width']) && is_numeric($_GET['height'])) {
    		$data = $_GET['width'] . '*' . $_GET['height'];
    	}
    }
     
    if(strlen($ip)<1 || strlen($data)<1 {
    	exit;
    }
     
    $pdo = new PDO('mysql:host=ip;dbname=db', 'id', '****');
     
    $exists_query = $pdo->prepare("SELECT COUNT(ip) FROM conf WHERE ip=:ip");
    $ok = $exists_query->execute(['ip' => $ip]);
    if($ok===false) {
    	error_log("failed to select conf: {$exists_query->errorCode()} {$exists_query->errorInfo()}");
    	exit;
    }
    $exists_row = $exists_query->fetchAll();
    $exists = $exists_row[0][0]>0;
     
    if($exists) {
    	exit;
    }
     
    $insert_query = $pdo->prepare("INSERT INTO conf (ip, reso) VALUES (:ip, :data)");
    $ok = $insert_query->execute(['ip' => $ip, 'data'=>$data]);
    if($ok===false) {
    	error_log("failed to insert conf: {$insert_query->errorCode()} {$insert_query->errorInfo()}");
    	exit;
    }
    je ne vois pas ce qui cloche pourrais-tu m'aider ?

  12. #12
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdo = new PDO('mysql:host=ip;dbname=db', 'id', '****');
    ça fait quoi ça, en vrai ? ça écrase $ip ?

    tu peux utiliser https://www.ipify.org/ pour connaitre simplement ton ip public.

    ----------------------------------

    Au passage, puisque désormais tu connais et comprends l'usage du verbe sql COUNT,
    tu pourrais aller un peu plus loin en t'appuyant sur une contrainte d'intégrité pour simplifier encore un peu.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `conf` (
      `ip` varchar(255) NOT NULL UNIQUE,
      `reso` varchar(255) NOT NULL,
      `id` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

    Tu commentes des trucs devenu inutile dans ton code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /* plus utile dans cette configuration
    $exists_query = $pdo->prepare("SELECT COUNT(ip) FROM conf WHERE ip=:ip");
    $ok = $exists_query->execute(['ip' => $ip]);
    if($ok===false) {
    	error_log("failed to select conf: {$exists_query->errorCode()} {$exists_query->errorInfo()}");
    	exit;
    }
    $exists_row = $exists_query->fetchAll();
    $exists = $exists_row[0][0]>0;
     
    if($exists) {
    	exit;
    }
    */
     
    $insert_query = $pdo->prepare("INSERT INTO conf (ip, reso) VALUES (:ip, :data)");
    $ok = $insert_query->execute(['ip' => $ip, 'data'=>$data]);
    /* en sourdine.
    if($ok===false) {
    	error_log("failed to insert conf: {$insert_query->errorCode()} {$insert_query->errorInfo()}");
    	exit;
    }
    */
    En théorie on devrait tester le code d'erreur pour détecter sa signification et lever une erreur si ce n'est pas
    en rapport avec une contrainte d'intégrité, en pratique, je ne sais pas dire si c'est standardisé (je dis cela parce que j'ai un doute, mais il semble bien que ce soit la foire).
    Donc, tu le mets en sourdine.

  13. #13
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Pour tester ton script, tu peux utiliser tor. ça te permettra de faire varier ton IP, sinon tu demandes à un ami. Tu peux aussi demander à un service web de prendre un screenshot de ta page, https://www.site-shot.com/

  14. #14
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Ne pas oublier d'activer les erreurs,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ini_set('display_errors', '1');
    ini_set('display_startup_errors', '1');
    error_reporting(E_ALL);

  15. #15
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    C'est la table qui n'est pas bien créée.

    Le champ id est not null. Il devrait être INTEGER PRIMARY KEY AUTOINCREMENT
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE IF NOT EXISTS `conf` (
      `id` INTEGER PRIMARY KEY AUTOINCREMENT,
      `ip` varchar(255) NOT NULL UNIQUE,
      `reso` varchar(255) NOT NULL
    )

  16. #16
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 123
    Par défaut
    Impossible de créer la table ' conf ' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Analyse statique :
     
    3 erreurs trouvées lors de l'analyse.
     
        Une virgule ou une parenthèse droite était attendus. (near "AUTOINCREMENT" at position 60)
        Début d'énoncé inattendu. (near "255" at position 91)
        Type d'énoncé non reconnu. (near "NOT NULL" at position 96)
     
    Requête SQL : Copier
     
    CREATE TABLE IF NOT EXISTS `conf` ( `id` INT PRIMARY KEY AUTOINCREMENT, `ip` varchar(255) NOT NULL UNIQUE, `reso` varchar(255) NOT NULL );
     
    MySQL a répondu : Documentation
    #1064 - Erreur de syntaxe près de '
      `ip` varchar(255) NOT NULL UNIQUE,
      `reso` varchar(255) NOT NULL
    )' à la ligne 2

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 549
    Billets dans le blog
    10
    Par défaut
    AUTO_INCREMENT s'écrit avec un underscore entre AUTO et INCREMENT
    Par ailleurs, dans les premiers messages, je vois que le moteur choisi était MyISAM, or ce moteur est à éviter, car il ne gère pas l'intégrité référentielle

  18. #18
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    bien vu, j'avais utiliser sqlite, d'où la subtil différence.

    https://www.sqlite.org/autoinc.html
    https://dev.mysql.com/doc/refman/8.0...increment.html

    c'est tellement standard le sql....

  19. #19
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 549
    Billets dans le blog
    10
    Par défaut
    Quelques remarques supplémentaires :

    • nommage des colonnes : les noms de colonnes tels que id ou ip sont trop courts, il ne facilitent pas les recherches.
      sans tomber dans le verbeux, on peut choisir un nom tel que id_reseau
      Par ailleurs, dans une BDD, un nom doit être unique, donc id, c'est bien trop court puisqu'il y en a un par table...
      Notez qu'il est inapproprié de parler de "champs" : les "champs" sont les zones des formulaires de saisie ou des états, dans les tables, ce sont des colonnes.
    • typage des colonnes : choisir du varchar(255) pour une adresse IP dont la longueur maximale est de 32 bits, soit 4 octets, n'a aucun intérêt.
      Le type et la longueur des colonnes doit être choisi en fonction du contenu.
    • utilisation des AUTO_INCREMENTS : quand une colonne est déclarée en auto_increment, à de rares exceptions près, il faut laisser le SGBD en attribuer la valeur lors de l'insertion.
      Pour ce faire, il ne faut pas déclarer la colonne concernée dans l'ordre insert. Par exemple, dans votre cas, l'ordre sera codé ainsi (avec des noms de table et de colonnes un peu mieux choisis :
      insert into CF_config (CF_adrip, CF_reseau) values ('192.168.1.1', 'reso1')La colonne CF_ident (plutôt que "id", trop court) sera alors affectée automatiquement par le moteur du SGBD.
    • quotes inversées : elles ne sont utiles que si les noms sont des mot réservés SQL ou que les noms contiennent des caractères spéciaux. Dans les deux cas, ce n'est évidemment pas recommandé.
      Le plus simple est donc d'éviter les noms réservés et caractères spéciaux et de s'affranchir de ces délimiteurs, pénibles à l'usage (Alt Gr + 7... c'est vite casse b####s).

  20. #20
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    de bonne remarques, mais pas sûr que le po en soit là.

    Peut être que ce qui est plus utile c'est d'introduire de la méthode dans ce capharnaüm que je regarde d'un œil vitreux depuis le début.

    Hier je m'étais motivé (c'était dur) à écrire (à coup de copier coller) un bout de code pour exécuter le script et ainsi lever les lièvres à l'avance.

    Pour cela j'ai écrit un script de pré chargement pour initialiser les globales,
    appeler le script,
    puis faire un contrôle de lecture manuel.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
     
    $args=[];
     
    for($i=1;$i<count($argv);$i++) {
      $t=[];
      parse_str($argv[$i], $t);
      foreach($t as $k=>$v){
        $args[$k]=$v;
      }
    }
     
    if(isset($args["-ip"])) {
      $_SERVER["REMOTE_ADDR"] = $args["-ip"];
    }
     
    if(isset($args["-fwdfor"])) {
      $_SERVER["HTTP_X_FORWARDED_FOR"] = $args["-fwdfor"];
    }
     
    if(isset($args["-realip"])) {
      $_SERVER["HTTP_X_REAL_IP"] = $args["-realip"];
    }
     
     
     
    if(isset($args["-reso"])) {
      $t=explode("*", $args["-reso"] );
      $_GET["width"] = $t[0];
      $_GET["height"] = $t[1];
    }
     
    $pdo = new PDO('sqlite:mydb.sq3');
     
    $pdo->exec("CREATE TABLE IF NOT EXISTS `conf` (
      `id` INTEGER PRIMARY KEY AUTOINCREMENT,
      `ip` varchar(255) NOT NULL UNIQUE,
      `reso` varchar(255) NOT NULL
    )
    ");
     
    include("script.php");
     
     
    $exists_query = $pdo->prepare("SELECT * FROM conf");
    $ok = $exists_query->execute();
    if($ok===false) {
    	error_log("failed to execute query: {$exists_query->errorCode()} {$exists_query->errorInfo()}");
    	exit;
    }
    $rows = $exists_query->fetchAll();
     
    var_dump($rows);
    Dans script.php j'ai repris le bout de code plus haut, j'ai par contre commenté l'init de la variable $pdo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php 
    session_cache_limiter('nocache');
     
    function get_ip_address() {
    	$ip = "";
    	$keys = ['HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'];
    	foreach( $keys as $key) {
    		if ( isset($_SERVER[$key]) ) {
    			$x = current(explode(",",$_SERVER[$key], 10));
    			$x = trim($x);
    			if(inet_pton($x)!==false) {
    				$ip = $x;
    				break;
    			}
    		}
    	}
    	return $ip;
    }
     
    $ip = get_ip_address();
     
    $data = "";
    if(isset($_GET['width']) && isset($_GET['height'])){
    	if (is_numeric($_GET['width']) && is_numeric($_GET['height'])) {
    		$data = $_GET['width'] . '*' . $_GET['height'];
    	}
    }
     
    if(strlen($ip)<1 || strlen($data)<1) {
    	exit;
    }
     
     
    $exists_query = $pdo->prepare("SELECT COUNT(ip) FROM conf WHERE ip=:ip");
    $ok = $exists_query->execute(['ip' => $ip]);
    if($ok===false) {
    	error_log("failed to select conf: {$exists_query->errorCode()} {$exists_query->errorInfo()}");
    	exit;
    }
    $exists_row = $exists_query->fetchAll();
    $exists = $exists_row[0][0]>0;
     
    if($exists) {
    	exit;
    }
     
    $insert_query = $pdo->prepare("INSERT INTO conf (ip, reso) VALUES (:ip, :data)");
    $ok = $insert_query->execute(['ip' => $ip, 'data'=>$data]);
    if($ok===false) {
    	error_log("failed to insert conf: {$insert_query->errorCode()} {$insert_query->errorInfo()}");
    	exit;
    }
    ça permet de faire varier les valeurs d'exécution avec des lignes de commande genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    php index.php -ip=1.1.1.1 -reso=10*190
    php index.php -ip=1.1.1.11 -reso=10*190
    A défaut de faire d'avoir un vrai banc de test, qui nécessiterait un setup bien plus important,
    ça aide à travailler.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Variable non prise en compte dans l'url
    Par duffman39 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 20/10/2011, 16h33
  2. Variable non prise en compte dans un formulaire
    Par stomerfull dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2008, 14h36
  3. feuille de style non prise en compte dans un module
    Par Phenomenium dans le forum Zend Framework
    Réponses: 14
    Dernier message: 17/07/2008, 12h17
  4. Réponses: 1
    Dernier message: 08/08/2007, 11h26
  5. [MySQL] Variable pas prise en compte dans la requête
    Par Zenerox dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/04/2007, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo