[RESOLU] Erreur requête dynamique

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] Erreur requête dynamique

Re: Erreur requête dynamique

par Nivek3713 » 13 juin 2020, 06:16

Bonjour et désolé du temps de réponse mais j'étais pas mal occupé ces derniers temps.
J'ai finalement réussi à trouver la solution en // avec ton message Spols. J'ai ainsi pu construire une requête dynamique et en faire un "moteur de recherche".

Ci-dessous le code :

<?php

$date_debut_complete = $_POST['date_debut']." 00:00:00";
$date_fin_complete = $_POST['date_fin']." 23:59:59";

try{
	$bdd = new PDO('mysql:host=localhost;dbname=com_api_mirfleet_schneider;charset=utf8', 'root', '');
}
catch (Exception $e){
		die('Erreur : '.$e->getMessage());
}

$reqTxt = 'SELECT * FROM reporting_missions_completed WHERE id>0';

if (isset($_POST['starting_point']) && $_POST['starting_point']!='') {
  $reqTxt.= " AND starting_point=".$_POST['starting_point']."";
}

if (isset($_POST['arrival_point']) && $_POST['arrival_point']!='') {
  $reqTxt.= " AND arrival_point=".$_POST['arrival_point']."";
}

if (isset($_POST['api_pallet_code']) && $_POST['api_pallet_code']!='') {
  $reqTxt.= " AND api_pallet_code=".$_POST['api_pallet_code']."";
}

if (isset($_POST['schneider_pallet_reference']) && $_POST['schneider_pallet_reference']!='') {
  $reqTxt.= " AND schneider_pallet_reference=".$_POST['schneider_pallet_reference']."";
}

switch ($_POST['format_pallet']) {
  case 'P06':
    $reqTxt.= " AND format_pallet='P06'";
    break;
  case 'P10':
    $reqTxt.= " AND format_pallet='P10'";
    break;
  case 'P12':
    $reqTxt.= " AND format_pallet='P12'";
    break;
}

switch ($_POST['process_status']) {
  case 'reception_de_la_palette':
    $reqTxt.= " AND process_status='Reception de la palette'";
    break;
  case 'creation_mission':
    $reqTxt.= " AND process_status='Creation mission'";
    break;
  case 'modification_etat_palette':
    $reqTxt.= " AND process_status='Modification etat palette'";
    break;
  case 'mission_terminee':
    $reqTxt.= " AND process_status='Mission terminee'";
    break;
}

switch ($_POST['pallet_status']) {
  case 'a_stocker':
    $reqTxt.= " AND pallet_status='A Stocker'";
    break;
  case 'attente_ie':
    $reqTxt.= " AND pallet_status='Attente IE'";
    break;
  case 'probleme_dnf':
    $reqTxt.= " AND pallet_status='Probleme DNF'";
    break;
  case 'probleme_logistique':
    $reqTxt.= " AND pallet_status='Probleme Logistique'";
    break;
  case 'retour_plateforme_logistique':
    $reqTxt.= " AND pallet_status='Retour Plateforme Logistique'";
    break;
  case 'stockee':
    $reqTxt.= " AND pallet_status='Stockee'";
    break;
}

switch ($_POST['rupture']) {
  case 'oui':
    $reqTxt.= " AND rupture='Oui'";
    break;
  case 'non':
    $reqTxt.= " AND rupture='Non'";
    break;
}

if (isset($_POST['date_debut'])) {
  $reqTxt.= " AND status_datetime >=\"$date_debut_complete\"";
}

if (isset($_POST['date_fin']) && ($_POST['date_fin']>$_POST['date_debut'])) {
  $reqTxt.= " AND status_datetime <=\"$date_fin_complete\"";
}

$req = $bdd->query($reqTxt);

?>

<!DOCTYPE html>
<html>
  	<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Control Tower : Logistique</title>
  	</head>

 	 <header>
  	<center><img src="images/banniere_haute_1400px.png" class="banniere_haute" alt="Image bannière haute"></center>
  	<br>
  	</header>

  	<body>
    
    <h2>Resultats de la recherche :</h2><br>

    <center><table id="dataTable" class="table">
    	<tr>
        <th><p>#</p></th>
        <th><p>Point de départ</p></th>
        <th><p>Point d'arrivée</p></th>
        <th><p>ID unique</p></th>
        <th><p>Réference palette</p></th>
        <th><p>Format palette</p></th>
        <th><p>Status du process</p></th>
        <th><p>Status de la palette</p></th>
        <th><p>Rupture</p></th>
        <th><p>Date & heure</p></th>
      </tr>

    	<tr>
    		<?php
			while ($donnees = $req->fetch()) {
					?>
					<td><center><?php echo $donnees['id']; ?></center></td>
					<td><center><?php echo $donnees['starting_point']; ?></center></td>
					<td><center><?php echo $donnees['arrival_point']; ?></center></td>
					<td><center><?php echo $donnees['api_pallet_code']; ?></center></td>
					<td><center><?php echo $donnees['schneider_pallet_reference']; ?></center></td>
					<td><center><?php echo $donnees['format_pallet']; ?></center></td>
					<td><center><?php echo $donnees['process_status']; ?></center></td>
					<td><center><?php echo $donnees['pallet_status']; ?></center></td>
          <td><center><?php echo $donnees['rupture']; ?></center></td>
					<td><center><?php echo $donnees['status_datetime']; ?></center></td>
		</tr>
				<?php } 
				$req->closeCursor();
				?>
    </table></center><br>

    <p>
		<form action="index.php">
			<button type="submit">Page précédente</button>
		</form>
	</p>

    <button id="btnExportToCsv" type="button" class="button">Exporter en CSV</button>
    <script src="js/TableCSVExporter.js"></script>

    <script>
      const dataTable = document.getElementById("dataTable");
      const btnExportToCsv = document.getElementById("btnExportToCsv");

    btnExportToCsv.addEventListener ("click", () => {
      const exporter = new TableCSVExporter (dataTable);
      const csvOutput = exporter.convertToCSV();
      const csvBlob = new Blob([csvOutput, { type: "text/csv" }]);
      const blobUrl = URL.createObjectURL(csvBlob);
      const anchorElement = document.createElement ("a");

      anchorElement.href = blobUrl;
      anchorElement.download = "table-export.csv";
      anchorElement.click();

      setTimeout(() => {
        URL.revokeObjectURL(blobUrl);
      }, 500);
    });

  </script>

  	</body>

  	<footer>
		<center><img src="images/banniere_basse_1400px.png" class="banniere_basse" alt="Image bannière basse"></center>
	</footer>

</html>

Je vous remercie d'avoir pris le temps de m'aider !

@+

Re: Erreur requête dynamique

par Spols » 08 juin 2020, 15:53

oui c'est ma faute j'ai été trop vite

il te faut récupèrer le résultat de ceci $bdd->query($req);
$result = $bdd->query($req);

et tu pourra boucler avec while( $donnes = $result->fetch)

Re: Erreur requête dynamique

par Nivek3713 » 08 juin 2020, 15:07

Bonjour Saian,

Merci de prendre le temps de m'aider.

Je suis bien en phase avec ça, j'arrive à faire une query et à l'afficher en temps normal, mais la je compose ma requête en plusieurs fois, et c'est la que j'ai un soucis...

Re: Erreur requête dynamique

par Saian » 08 juin 2020, 15:04

Salut, PDO::query retourne un jeu de résultat PDOStatement et c'est cet objet qui possède une méthode fetch.
https://www.php.net/manual/fr/pdo.query.php
https://www.php.net/manual/fr/pdostatement.fetch.php

Re: Erreur requête dynamique

par Nivek3713 » 08 juin 2020, 13:23

Salut,

Malheureusement ça ne marche pas mieux...
J'ai l'érreur suivante :

( ! ) Fatal error: Uncaught Error: Call to undefined method PDO::fetch() in C:\wamp64\www\dev\schneider_hmi_log\schneider_hmi_log_v1\rechercheBaseReporting.php on line 73
( ! ) Error: Call to undefined method PDO::fetch() in C:\wamp64\www\dev\schneider_hmi_log\schneider_hmi_log_v1\rechercheBaseReporting.php on line 73
Call Stack
# Time Memory Function Location
1 0.0012 411424 {main}( ) ...\rechercheBaseReporting.php:0

Je suis complètement perdu...
Tu aurais moyen de checker le code de ton côté stp Spols ?

Merci d'avance...

Re: Erreur requête dynamique

par Spols » 08 juin 2020, 08:31

essaye

while ($donnees = $bdd->fetch())

Re: Erreur requête dynamique

par Nivek3713 » 04 juin 2020, 20:41

J'ai justement déjà essayé mais ça ne marche pas mieux...

<?php

$starting_point = $_POST['starting_point'];

$arrival_point = $_POST['arrival_point'];
$api_pallet_code = $_POST['api_pallet_code'];
$schneider_pallet_reference = $_POST['schneider_pallet_reference'];
$format_pallet = $_POST['format_pallet'];
$process_status = $_POST['process_status'];
$pallet_status = $_POST['pallet_status'];
$rupture = $_POST['rupture'];
$date_debut = $_POST['date_debut'];
$date_fin = $_POST['date_fin'];
$heure_debut = "00:00:00";
$heure_fin = "23:59:59";
$date_debut_complete = $date_debut." ".$heure_debut;
$date_fin_complete = $date_fin." ".$heure_fin;

try
{
	$bdd = new PDO('mysql:host=localhost;dbname=com_api_mirfleet_schneider;charset=utf8', 'root', '');
}
catch (Exception $e)
{
		die('Erreur : '.$e->getMessage());
}

$req = "SELECT * FROM reporting_missions_completed WHERE 1=1";

if (isset($_POST['starting_point']) && $_POST['starting_point']!='') 
{
  $req.=' AND starting_point=' . $_POST['starting_point'] . ' ';
}

echo $req;
$bdd->query($req);

?>

<!DOCTYPE html>
<html>
  	<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Control Tower : Logistique</title>
  	</head>

 	 <header>
  	<center><img src="images/banniere_haute_1400px.png" class="banniere_haute" alt="Image bannière haute"></center>
  	<br>
  	</header>

  	<body>
    
    <h2>Resultats de la recherche :</h2><br>

    <center><table id="dataTable" class="table">
    	<tr>
        <th><p>#</p></th>
        <th><p>Point de départ</p></th>
        <th><p>Point d'arrivée</p></th>
        <th><p>ID unique</p></th>
        <th><p>Réference palette</p></th>
        <th><p>Format palette</p></th>
        <th><p>Status du process</p></th>
        <th><p>Status de la palette</p></th>
        <th><p>Rupture</p></th>
        <th><p>Date & heure</p></th>
      </tr>

    	<tr>
    		<?php
			while ($donnees = $req->fetch()) 
				{
					?>
					<td><center><?php echo $donnees['id']; ?></center></td>
					<td><center><?php echo $donnees['starting_point']; ?></center></td>
					<td><center><?php echo $donnees['arrival_point']; ?></center></td>
					<td><center><?php echo $donnees['api_pallet_code']; ?></center></td>
					<td><center><?php echo $donnees['schneider_pallet_reference']; ?></center></td>
					<td><center><?php echo $donnees['format_pallet']; ?></center></td>
					<td><center><?php echo $donnees['process_status']; ?></center></td>
					<td><center><?php echo $donnees['pallet_status']; ?></center></td>
          <td><center><?php echo $donnees['rupture']; ?></center></td>
					<td><center><?php echo $donnees['status_datetime']; ?></center></td>
		</tr>
				<?php } 
				$req->closeCursor();
				?>
    </table></center><br>

    <p>
		<form action="pageLogistique.php">
			<button type="submit">Page précédente</button>
		</form>
	</p>

    <button id="btnExportToCsv" type="button" class="button">Exporter en CSV</button>
    <script src="js/TableCSVExporter.js"></script>

    <script>
      const dataTable = document.getElementById("dataTable");
      const btnExportToCsv = document.getElementById("btnExportToCsv");

    btnExportToCsv.addEventListener ("click", () => {
      const exporter = new TableCSVExporter (dataTable);
      const csvOutput = exporter.convertToCSV();
      const csvBlob = new Blob([csvOutput, { type: "text/csv" }]);
      const blobUrl = URL.createObjectURL(csvBlob);
      const anchorElement = document.createElement ("a");

      anchorElement.href = blobUrl;
      anchorElement.download = "table-export.csv";
      anchorElement.click();

      setTimeout(() => {
        URL.revokeObjectURL(blobUrl);
      }, 500);
    });

  </script>

  	</body>

  	<footer>
		<center><img src="images/banniere_basse_1400px.png" class="banniere_basse" alt="Image bannière basse"></center>
	</footer>

</html>

Je pense que je passe à coter de quelque chose mais je n'arrive pas a voir quoi...

J'ai l'erreur suivante avec ce code :
( ! ) Fatal error: Uncaught Error: Call to a member function fetch() on string in C:\wamp64\www\dev\schneider_hmi_log\schneider_hmi_log_v1\rechercheBaseReporting.php on line 73
( ! ) Error: Call to a member function fetch() on string in C:\wamp64\www\dev\schneider_hmi_log\schneider_hmi_log_v1\rechercheBaseReporting.php on line 73
Call Stack
# Time Memory Function Location
1 0.0014 411424 {main}( ) ...\rechercheBaseReporting.php:0

Je comprend pas, ça fait une semaine que je planche la dessus et j'arrive pas à comprendre...

Re: Erreur requête dynamique

par Spols » 04 juin 2020, 14:44

tu as un $bdd = new PDO ...

ensuite tu remplis $req avec une chaine de caractère.

et tu essaye de faire $req->execute();

PHP te dit "Fatal error: Uncaught Error: Call to a member function execute() on string" donc il précise que tu tente de faire un execute sur un string (chaine de caractère)

relis la doc pour l'utilisation de pdo soit tu utilise $bdd->prepare($req) soit $bdd->query($req).

Re: Erreur requête dynamique

par Nivek3713 » 04 juin 2020, 14:33

Salut Spols,

Je te remercie tout d'abord d'avoir pris le temps de me répondre :)

Comme expliqué plus haut, je n'ai que des bases en PHP et SQL...
Ce que tu me répond donc est quelque peu... asbtrait... :oops:
Tu peux m'aider de façon plus précise please ?

Merci d'avance !!! :priere:

Re: Erreur requête dynamique

par Spols » 04 juin 2020, 12:58

le problème n'est pas dans la construction de ta raquète mais bien dans son utilisation finale.

il faut utiliser ton instance $bdd et lui indiquer la requète, pas utiliser la requète comme un objet PDO

Erreur requête dynamique

par Nivek3713 » 03 juin 2020, 20:48

Bonjour à tous,

Je suis débutant en php et je développe pour un projet professionnel un outil de recherche.

L'idée est la suivante : L'utilisateur saisie via un formulaire HTML un ou plusieurs champs, et suivant les champs qu'il à rempli, le php va chercher dans la base SQL selon les critères saisies.

Le code HTML qui me permet la saisie est la suivant :
<center>
    	<fieldset>
    		<legend>Recherche dans la base de reporting et export</legend>
    		<p>
			    <form method="post" action="rechercheBaseReporting.php">
			    	<p>
			    		<label for="starting_point"> Point de départ :</label>
			    		<input type="text" name="starting_point" id="starting_point">
			    	</p>

			    	<p>	
			    		<label for="arrival_point"> Point d'arrivée :</label>
			    		<input type="text" name="arrival_point" id="arrival_point"><br>
			    	</p>

			    	<p>	
			    		<label for="api_pallet_code"> ID unique palette :</label>
			    		<input type="text" name="api_pallet_code" id="api_pallet_code"><br>
			    	</p>

			    	<p>	
			    		<label for="schneider_pallet_reference"> Réference palette SCHNEIDER :</label>
			    		<input type="text" name="schneider_pallet_reference" id="schneider_pallet_reference"><br>
			    	</p>

			    	<p>
			    		<label for="format_pallet"> Format palette :</label>
			    		<select name="format_pallet" id="format_pallet">
			    			<option value="ALL" selected>ALL</option>
							<option value="P06">P06</option>
							<option value="P10">P10</option>
							<option value="P12">P12</option>
						</select>
			    	</p>

			    	<p>
			    		<label for="process_status"> Statut process :</label>
			    		<select name="process_status" id="process_status">
			    			<option value="ALL" selected>ALL</option>
							<option value="reception_de_la_palette">Réception de la palette</option>
							<option value="creation_mission">Création mission</option>
							<option value="mission_terminee">Mission terminee</option>
							<option value="modification_etat_palette">Modification etat palette</option>
						</select>
			    	</p>

			    	<p>
			    		<label for="pallet_status"> Statut palette :</label>
			    		<select name="pallet_status" id="pallet_status">
			    			<option value="ALL" selected>ALL</option>
							<option value="a_stocker">A Stocker</option>
							<option value="attente_ie">Attente IE</option>
							<option value="probleme_dnf">Probleme DNF</option>
							<option value="probleme_logistique">Probleme Logistique</option>
							<option value="retour_plateforme_logistique">Retour Plateforme Logistique</option>
							<option value="stockee">Stockee</option>
						</select>
			    	</p>

			    	<p>
			    		<label for="rupture"> Rupture :</label>
			    		<select name="rupture" id="rupture">
			    			<option value="ALL" selected>ALL</option>
							<option value="oui">Oui</option>
							<option value="non">Non</option>
						</select>
			    	</p>

			    	<p>
			    		<label for="date_debut"> Date : du</label>
			    		<input type="date" name="date_debut" id="date_debut">
			    		<label for="date_fin"> au :</label>
			    		<input type="date" name="date_fin" id="date_fin">
			    	</p>

			    	<p>
			    		<input type="submit" value="Rechercher">
			    	</p>
			    		
			    </form>

			    </p>
		</fieldset>
	</center><br>

Le code php appelé par ce formulaire est le suivant :
<?php

$starting_point = $_POST['starting_point'];

$arrival_point = $_POST['arrival_point'];
$api_pallet_code = $_POST['api_pallet_code'];
$schneider_pallet_reference = $_POST['schneider_pallet_reference'];
$format_pallet = $_POST['format_pallet'];
$process_status = $_POST['process_status'];
$pallet_status = $_POST['pallet_status'];
$rupture = $_POST['rupture'];
$date_debut = $_POST['date_debut'];
$date_fin = $_POST['date_fin'];
$heure_debut = "00:00:00";
$heure_fin = "23:59:59";
$date_debut_complete = $date_debut." ".$heure_debut;
$date_fin_complete = $date_fin." ".$heure_fin;

try
{
	$bdd = new PDO('mysql:host=localhost;dbname=com_api_mirfleet_schneider;charset=utf8', 'root', '');
}
catch (Exception $e)
{
		die('Erreur : '.$e->getMessage());
}

$req = "SELECT * FROM reporting_missions_completed WHERE 1=1";

if (isset($_POST['starting_point']) && $_POST['starting_point']!='') 
{
  $req.=' AND starting_point=' . $_POST['starting_point'] . ' ';
}

echo $req;
$req->execute();

?>

<!DOCTYPE html>
<html>
  	<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Control Tower : Logistique</title>
  	</head>

 	 <header>
  	<center><img src="images/banniere_haute_1400px.png" class="banniere_haute" alt="Image bannière haute"></center>
  	<br>
  	</header>

  	<body>
    
    <h2>Resultats de la recherche :</h2><br>

    <center><table id="dataTable" class="table">
    	<tr>
        <th><p>#</p></th>
        <th><p>Point de départ</p></th>
        <th><p>Point d'arrivée</p></th>
        <th><p>ID unique</p></th>
        <th><p>Réference palette</p></th>
        <th><p>Format palette</p></th>
        <th><p>Status du process</p></th>
        <th><p>Status de la palette</p></th>
        <th><p>Rupture</p></th>
        <th><p>Date & heure</p></th>
      </tr>

    	<tr>
    		<?php
			while ($donnees = $req->fetch()) 
				{
					?>
					<td><center><?php echo $donnees['id']; ?></center></td>
					<td><center><?php echo $donnees['starting_point']; ?></center></td>
					<td><center><?php echo $donnees['arrival_point']; ?></center></td>
					<td><center><?php echo $donnees['api_pallet_code']; ?></center></td>
					<td><center><?php echo $donnees['schneider_pallet_reference']; ?></center></td>
					<td><center><?php echo $donnees['format_pallet']; ?></center></td>
					<td><center><?php echo $donnees['process_status']; ?></center></td>
					<td><center><?php echo $donnees['pallet_status']; ?></center></td>
          <td><center><?php echo $donnees['rupture']; ?></center></td>
					<td><center><?php echo $donnees['status_datetime']; ?></center></td>
		</tr>
				<?php } 
				$req->closeCursor();
				?>
    </table></center><br>

    <p>
		<form action="pageLogistique.php">
			<button type="submit">Page précédente</button>
		</form>
	</p>

    <button id="btnExportToCsv" type="button" class="button">Exporter en CSV</button>
    <script src="js/TableCSVExporter.js"></script>

    <script>
      const dataTable = document.getElementById("dataTable");
      const btnExportToCsv = document.getElementById("btnExportToCsv");

    btnExportToCsv.addEventListener ("click", () => {
      const exporter = new TableCSVExporter (dataTable);
      const csvOutput = exporter.convertToCSV();
      const csvBlob = new Blob([csvOutput, { type: "text/csv" }]);
      const blobUrl = URL.createObjectURL(csvBlob);
      const anchorElement = document.createElement ("a");

      anchorElement.href = blobUrl;
      anchorElement.download = "table-export.csv";
      anchorElement.click();

      setTimeout(() => {
        URL.revokeObjectURL(blobUrl);
      }, 500);
    });

  </script>

  	</body>

  	<footer>
		<center><img src="images/banniere_basse_1400px.png" class="banniere_basse" alt="Image bannière basse"></center>
	</footer>

</html>
Je n'arrive absolument pas à construire ma requête dynamique, j'ai l'erreur suivante :

( ! ) Fatal error: Uncaught Error: Call to a member function execute() on string in C:\wamp64\www\dev\schneider_hmi_log\schneider_hmi_log_v1\rechercheBaseReporting.php on line 36
( ! ) Error: Call to a member function execute() on string in C:\wamp64\www\dev\schneider_hmi_log\schneider_hmi_log_v1\rechercheBaseReporting.php on line 36
Call Stack
# Time Memory Function Location
1 0.0014 412520 {main}( ) ...\rechercheBaseReporting.php:0

J'ai essayé à plusieurs reprises de modifier ma requête, je cherche dans un premier temps à prendre seulement le paramètre starting_point en compte mais même cela est compliqué...

Help please !!! :oops:

Merci d'avance.