8768 sujets

Développement web côté serveur, CMS

Bonsoir,
Là, je cale ! (Une fois de plus)
J'essaie d'insérer une fiche dans une table Sqlite3.
La page appelante :

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Création nouvelle fiche</title>
  <meta name="keywords" content="Attalens, camping, caravanning, Philippe Dumas, combinazione, escroquerie, Michel Chevalley, parti pdc, rotary"/>
  <link rel="stylesheet" type="text/css" href="maj.css" />
  <link rel="icon" type="image/ico" href="../favicon.ico" />

</head>

<body>
	<div class="global">  <!-- Conteneur de toute la page -->

	<header class="entete"> <!-- En-tête -->
		<h2>DELWIN</h2>
		<h2>Création d'une nouvelle fiche</h2>	
	</header>   <!-- Fin d'en-tête -->
 
    <div class="form-group">
		<form method="post" action="ins-delwin.php" id="register_form" accept-charset = "utf-8" >
       
        <span>
		<pre>                Nom          		<input autofocus="" class="ttit" id="nom" placeholder="Nom" type="text">
		
		Téléphone               <input autofocus="" class="ttit" id="tel" placeholder="Téléphone" type="text">
		
		Ligne d'adresse 1       <input autofocus="" class="ttit" id="ad1" placeholder="ad1" type="text">
		
		Ligne d'adresse 2       <input autofocus="" class="ttit" id="ad2" placeholder="ad2" type="text">
		
		Ligne d'adresse 3       <input autofocus="" class="ttit" id="ad3" placeholder="ad3" type="text">
		
		Ligne d'adresse 4       <input autofocus="" class="ttit" id="ad4" placeholder="ad4" type="text">
		
		Ligne d'adresse 5       <input autofocus="" class="ttit" id="ad5" placeholder="ad5" type="text">
		
		Ligne d'adresse 6       <input autofocus="" class="ttit" id="ad6" placeholder="ad6" type="text">
		
		Ligne d'adresse 7       <input autofocus="" class="ttit" id="ad7" placeholder="ad7" type="text">
		
		</pre>
		</span>
		
        <p class = "centre">
                <button class="tdat" type = "submit">Enregister</button>
        </p>
		</form>
        </div> <!--Fin Form-group -->

    </div> <!--Fin Global -->
		<!-- Pied de page -->		
		<footer class="pied">
			<a href="../choix.html">Retour</a> 
		</footer>	
</body>
</html>

La page appelée .

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Création nouvelle fiche</title>
  <meta name="keywords" content="Attalens, camping, caravanning, Philippe Dumas, combinazione, escroquerie, Michel Chevalley, parti pdc, rotary"/>
  <link rel="stylesheet" type="text/css" href="maj.css" />
  <link rel="icon" type="image/ico" href="../favicon.ico" />

</head>

<body>
	<div class="global">  <!-- Conteneur de toute la page -->

	<header class="entete"> <!-- En-tête -->
		<h2>DELWIN</h2>
		<h2>Insertion d'une nouvelle fiche</h2>	
	</header>   <!-- Fin d'en-tête -->
  <?php
	header('Content-Type: text/html; charset=utf-8');	
//open the database
	$datasetname='sqlite:../../../labase/labase.db';

    try{
      $dbh=new PDO($datasetname);
	  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit;
    }

	$nom = $_POST["nom"];
	$tel = $_POST["tel"];
	$ad1 = $_POST["ad1"];
	$ad2 = $_POST["ad2"];
	$ad3 = $_POST["ad2"];
	$ad4 = $_POST["ad4"];
	$ad5 = $_POST["ad5"];
	$ad6 = $_POST["ad6"];
	$ad7 = $_POST["ad7"];

//Insert nouvelle fiche  

	$sql = ("insert into delwin (fnom, tel, ad1, ad2, ad3, ad4, ad5, ad6, ad7) 
		VALUES ('$nom', '$tel', '$ad1', '$ad2', '$ad3', $ad4, '$ad5', '$ad6', '$ad7');");
	if(!$dbh->query($sql)) echo "Pb d'accès à la table delwin";
	else
	{
//Voir la table...
	print "<table border=1>";
	$result = $sql->query('select * from delwin where cle = max(cle)');
	

	foreach($result as $row)
	{
	
		print 
		print $row['nom'];
		print $row['tel'];
		print $row['ad1'];
		print $row['ad2'];
		print $row['ad3'];
		print $row['ad4'];		
		print $row['ad5'];
		print $row['ad6'];
		print $row['ad7'];
	}
	}
?>

</body>
</html>


Avec un petit contrôle en fin de page pour vérifier le bon déroulement de l'opération.
Le résultat est déprimant et déroutant ...
a écrit :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 near ",": syntax error' in C:\WorkSite\EasyPHP-12.1\www\denis\rem\majdelwin\ins-delwin.php:47 Stack trace: #0 C:\WorkSite\EasyPHP-12.1\www\denis\rem\majdelwin\ins-delwin.php(47): PDO->query('insert into del...') #1 {main} thrown in C:\WorkSite\EasyPHP-12.1\www\denis\rem\majdelwin\ins-delwin.php on line 47

Qui ne foctionne pas ? Le post, ma requête sql ? Autre chose ?
Je suis démuni !
A l'aide !
Merci à tous
Cordialement
H.
Modérateur
Salut,

il manque les attributs name à tes inputs. Pour t'en assurer, fait un print_r ou un var_dump de $_post après soumission du form


if(!empty($_POST)){
var_dump($_POST);
die;
}


Mettre autant d'autofocus, je ne suis pas sûr que ce soit une bonne idée. Un seul devrait suffire.
Modifié par niuxe (22 Oct 2023 - 00:48)
Modérateur
Je vois que tu es redondant dans ton code. Jette un coup d'oeil sur cela (je te solutionne ton souci par la même occasion) :
arborescence des fichiers

schema de la base sqlite

CREATE TABLE IF NOT EXISTS "delwin" (
	"id"	INTEGER NOT NULL,
	"nom"	TEXT,
	"tel"	TEXT,
	"ad1"	TEXT,
	"ad2"	TEXT,
	"ad3"	TEXT,
	"ad4"	TEXT,
	"ad5"	TEXT,
	"ad6"	TEXT,
	"ad7"	TEXT,
	PRIMARY KEY("id" AUTOINCREMENT)
);


index.php

<?php
    try{
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);
        

        define('ROOT', dirname(__FILE__));
        define('LIBS', sprintf('%s/%s', ROOT, 'libs'));
        define('CTRL', sprintf('%s/%s', ROOT, 'controllers'));
        define('VIEWS', sprintf('%s/%s', ROOT, 'views'));
        define('DEFAULT_VIEW', 'form');

        require_once sprintf('%s/functions.php', LIBS);

        frontal(!empty($_GET['page']) ? $_GET['page'] : DEFAULT_VIEW);
    }catch(Exception $e){
        echo $e->getMessage();
    }
?>


libs/functions.php

<?php

function get_db($path){
    try{
        $dns = sprintf('sqlite:%s/%s', ROOT, $path);
        $pdo = new PDO($dns);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ERRMODE_WARNING | ERRMODE_EXCEPTION | ERRMODE_SILENT
        return $pdo;
    } catch(Exception $e) {
        echo "Impossible d'accéder à la base de données SQLite : ".$e->getMessage();
        die();
    }
}


function frontal($page){
    $pages_list = glob(sprintf('%s/*.php', CTRL));
    $isViewCalled = !empty($page) && in_array(sprintf('%s/%s.php', CTRL, $page), $pages_list);
    $view = $isViewCalled ? $page : '404';

    if($view === '404'){
        header('HTTP/1.0 404 Not Found');
        render('404', ['title' => '404 page not found']);
        die;
    }

    require_once sprintf('%s/%s.php', CTRL, $view);
}

function generate($file, $data){
    if(file_exists($file)){
        extract($data);
        ob_start();
        require_once $file;
        return ob_get_clean();
    }else{
        throw new \Exception(sprintf('fichier %s introuvable', $file));
    }
}


function render($view_file, $data=[], $layout='default'){
    $view = sprintf('%s/%s.php', VIEWS, $view_file);
    $args = [
        'content' => generate($view, $data),
    ];
    $data_to_layout = array_merge($args, $data);
    $layout = sprintf('%s/%s.php', VIEWS, $layout);
    echo generate($layout, $data_to_layout);
}
?>


controllers/form.php

<?php
    $view = 'form_view';
    $data = [
        'title' => 'mon titre'
    ];
    render($view, $data);
?>


controllers/insert.php

<?php
    if(!empty($_POST)){
        $db = get_db('mydb');

        $sql = "
            INSERT INTO delwin
                (nom, tel, ad1, ad2, ad3, ad4, ad5, ad6, ad7) 
            VALUES
                (:nom, :tel, :ad1, :ad2, :ad3, :ad4, :ad5, :ad6, :ad7)
        ";
        $sttmt = $db->prepare($sql);
        $result = $sttmt->execute($_POST);
        
        $response = $result ? 'enregistrement effectué' : 'erreur enregistrement';

        render('insert_view', [
            'result' => $response,
            'type_result' => $result ? 'success' : 'alert',
            'title' => "résultat de l'insertion en base"  
        ]);
    }
?>



views/404.php

<h1>page not found</h1>


views/default.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><?= isset($title) ? $title : 'ACME' ?></title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.8.1/dist/css/foundation-float.min.css" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.8.1/dist/css/foundation-prototype.min.css" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.8.1/dist/css/foundation-rtl.min.css" crossorigin="anonymous">
</head>
<body>
    <?= $content ?>
</body>
</html>


views/form_view.php

<form action="index.php?page=insert" method="POST" class="margin-vertical-3">
    <div class="grid-container">
        <div class="grid-x grid-padding-x">
            <div class="medium-6 cell">
                <label>
                    <span>nom</span>
                    <input type="text" name="nom" value="nom">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>tel</span>
                    <input type="text" name="tel" value="tel">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 1</span>
                    <input type="text" name="ad1" value="ad1">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 2</span>
                    <input type="text" name="ad2" value="ad2">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 3</span>
                    <input type="text" name="ad3" value="ad3">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 4</span>
                    <input type="text" name="ad4" value="ad4">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 5</span>
                    <input type="text" name="ad5" value="ad5">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 6</span>
                    <input type="text" name="ad6" value="ad6">
                </label>
            </div>
            <div class="medium-6 cell">
                <label>
                    <span>ad 7</span>
                    <input type="text" name="ad7" value="ad7">
                </label>
            </div>
            <div class="medium-12 cell">
                <button class="button expanded" type="submit">envoyer</button>
            </div>
        </div>
    </div>
</form>


views/insert_view.php

<div class="grid-container margin-vertical-3">
    <div class="callout <?= $type_result ?>">
        <p><?= $result ?></p>
        <p>revenir au <a href="?page=form">formulaire</a></p>
    </div>
</div>

Modifié par niuxe (22 Oct 2023 - 18:41)
Salut à tous,
Ca ne va pas mieux ... mais je ne renonce pas !
J'ai testé le post et j'ai bience que j'attendais :

Résultats du test

On vérifie dhrarray(9) { ["nom"]=> string(3) "dhr" ["tel"]=> string(14) "09 80 99 84 35" ["ad1"]=> string(0) "" ["ad2"]=> string(0) "" ["ad3"]=> string(0) "" ["ad4"]=> string(0) "" ["ad5"]=> string(0) "" ["ad6"]=> string(0) "" ["ad7"]=> string(0) "" } ça marche


Je mets le test en commentaires et je relance ... et là, badaboum !

Erreur à la ligne 60

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 near ",": syntax error' in C:\WorkSite\EasyPHP-12.1\www\denis\rem\majdelwin\ins-delwin.php:60 Stack trace: #0 C:\WorkSite\EasyPHP-12.1\www\denis\rem\majdelwin\ins-delwin.php(60): PDO->query('insert into del...') #1 {main} thrown in C:\WorkSite\EasyPHP-12.1\www\denis\rem\majdelwin\ins-delwin.php on line 60

Ma page appelante :

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Création nouvelle fiche</title>
  <meta name="keywords" content="Attalens, camping, caravanning, Philippe Dumas, combinazione, escroquerie, Michel Chevalley, parti pdc, rotary"/>
  <link rel="stylesheet" type="text/css" href="maj.css" />
  <link rel="icon" type="image/ico" href="../favicon.ico" />

</head>

<body>
	<div class="global">  <!-- Conteneur de toute la page -->

	<header class="entete"> <!-- En-tête -->
		<h2>DELWIN</h2>
		<h2>Création d'une nouvelle fiche</h2>	
	</header>   <!-- Fin d'en-tête -->
 
    <div class="form-group">
		<form method="post" action="ins-delwin.php" id="register_form" accept-charset = "utf-8" >
       
        <span>
		<pre>                Nom          		<input  autofocus="" class="ttit" id="nom" name="nom" placeholder="Nom" type="text">
		
		Téléphone               <input  class="ttit" id="tel" name="tel" placeholder="Téléphone" type="text">
		
		Ligne d'adresse 1       <input  class="ttit" id="ad1" name="ad1" placeholder="ad1" type="text">
		
		Ligne d'adresse 2       <input  class="ttit" id="ad2" name="ad2" placeholder="ad2" type="text">
		
		Ligne d'adresse 3       <input  class="ttit" id="ad3" name="ad3" placeholder="ad3" type="text">
		
		Ligne d'adresse 4       <input  class="ttit" id="ad4" name="ad4" placeholder="ad4" type="text">
		
		Ligne d'adresse 5       <input  class="ttit" id="ad5" name="ad5" placeholder="ad5" type="text">
		
		Ligne d'adresse 6       <input  class="ttit" id="ad6" name="ad6" placeholder="ad6" type="text">
		
		Ligne d'adresse 7       <input  class="ttit" id="ad7" name="ad7" placeholder="ad7" type="text">
		
		</pre>
		</span>
		
        <p class = "centre">
                <button class="tdat" type = "submit">Enregister</button>
        </p>
		</form>
        </div> <!--Fin Form-group -->

    </div> <!--Fin Global -->
		<!-- Pied de page -->		
		<footer class="pied">
			<a href="../choix.html">Retour</a> 
		</footer>	
</body>
</html>

Ma page appelée :

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Création nouvelle fiche</title>
  <meta name="keywords" content="Attalens, camping, caravanning, Philippe Dumas, combinazione, escroquerie, Michel Chevalley, parti pdc, rotary"/>
  <link rel="stylesheet" type="text/css" href="maj.css" />
  <link rel="icon" type="image/ico" href="../favicon.ico" />

</head>

<body>
	<div class="global">  <!-- Conteneur de toute la page -->

	<header class="entete"> <!-- En-tête -->
		<h2>DELWIN</h2>
		<h2>Insertion d'une nouvelle fiche</h2>	
	</header>   <!-- Fin d'en-tête -->
  <?php
	header('Content-Type: text/html; charset=utf-8');	
//open the database
	$datasetname='sqlite:../../../labase/labase.db';

    try{
      $dbh=new PDO($datasetname);
	  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit;
    }

	$nom = $_POST["nom"];
	$tel = $_POST["tel"];
	$ad1 = $_POST["ad1"];
	$ad2 = $_POST["ad2"];
	$ad3 = $_POST["ad2"];
	$ad4 = $_POST["ad4"];
	$ad5 = $_POST["ad5"];
	$ad6 = $_POST["ad6"];
	$ad7 = $_POST["ad7"];
	
/*
// On vérifie ...
	echo "On vérifie  ";
	echo $nom;
	if(!empty($_POST)){
	var_dump($_POST);
	echo "   ça marche";
	die;
	}
// Et jusque là ça marche 	

*/
//Insert nouvelle fiche  
	$sql = ("insert into delwin (nom, tel, ad1, ad2, ad3, ad4, ad5, ad6, ad7) 
		VALUES ('$nom', '$tel', '$ad1', '$ad2', '$ad3', $ad4, $ad5', $ad6', $ad7');");
	if(!$dbh->query($sql)) echo "Pb d'accès à la table delwin";
	else
	{
//Voir la table...
	print "<table border=1>";
	$result = $sql->query('select * from delwin where cle = max(cle)');
	foreach($result as $row)
	{
		print 
		print $row['nom'];
		print $row['tel'];
		print $row['ad1'];
		print $row['ad2'];
		print $row['ad3'];
		print $row['ad4'];		
		print $row['ad5'];
		print $row['ad6'];
		print $row['ad7'];
	}
	}
?>

</body>
</html>

Et le dessin de la table dans la base :

create table delwin(
nom text,
tel text,
ad1 text,
ad2 text,
ad3 text,
ad4 text,
ad5 text,
ad6 text,
ad7 text,
cle integer primary key
)
;


Je suis démuni ! Ma requête $sql a l'air de poser un problème, mais je ne sais pas où ! near "," me semble bien ambigu, vu le nombre de virgule dans cette requête !
A l'aide ! Je me noie !
Merci d'avance
Cordialement
H.
Modérateur
Salut,

As-tu essayé ce que je t'ai écrit ?

édit :
Relis bien cette ligne ¹


...
VALUES ('$nom', '$tel', '$ad1', '$ad2', '$ad3', $ad4, $ad5', $ad6', $ad7');");
...


¹ cette manière de créer une requête est à proscrire… (requête préparée)
Modifié par niuxe (24 Oct 2023 - 14:18)
Meilleure solution
Merci à tous, merci à Niuxe,
Bien entendu, ça crevait les yeux, mais je n'y avais rien vu ! Jutes une poignée de quotes qui manquaient !
Bonne fin de journée.
Cordialement.
H.