Page 1 sur 1

Parse error dans une requête SQL

Posté : 21 nov. 2013, 14:24
par Herve_be
Bonjour,
Je voudrais connaître le nombre de records d'une table, ce qui me semble très simple, mais j'obtiens un Parse error: syntax error, unexpected T_STRING !
Je dois être aveugle mais je ne comprends pas.
Base de données : VTTlog (Date, Name, Choice,Comment)
select count(*) as countrows from VTTlog;
En fait je voudrais connaître le nombre de records dont "Choice" a une valeur différente pour une "Date" donnée.
J'avais essayé le code ci-dessous mais si déjà la simple requête ci-dessus ne fonctionne pas ...
select count(distinct Choice) as $countrows from VTTlog where Date = $ListDate;
Merci d'avance pour votre aide.

Re: Parse error

Posté : 21 nov. 2013, 15:01
par moogli
salut,

merci d'utiliser un titre explicite si possible.

le message d'erreur que tu indique est un message d'erreur de PHP et tu fournis du code SQL.

tous ce que je peux te dire c'est que ton code n'est pas syntaxiquement correct et que le message d'erreur t'indique la ligne de l'erreur.

je t'invite aussi a regarder du coté des IDE (comme eclipse, netbeans, phpstorm et j'en oublie) qui t'indiquerais la chose directement :)


@+

Re: Parse error

Posté : 21 nov. 2013, 15:37
par Herve_be
J'avais d'abord posé ma question dans la section SQL; réponse :
C'est une erreur de syntaxe, une erreur PHP, pas une erreur SQL
Alors je la pose dans la section PHP; réponse :
le message d'erreur que tu indique est un message d'erreur de PHP et tu fournis du code SQL.
|*()

Re: Parse error

Posté : 21 nov. 2013, 15:49
par juliette
Salut,
il me semble que les deux réponses que tu montre veulent sensiblement dire la même chose, non ?

Re: Parse error

Posté : 21 nov. 2013, 16:11
par sirakawa
0 Parse error comme titre n'est pas très instructif.
1 Impératif
passer à mysqli
2
$countmot suppose une variable php déjà affectée. mMysql va quand même fonctionner
un truc qui fonctionne:
<?PHP
//gestion correcte des accents et autres
mb_internal_encoding( 'UTF-8');  //gère correctement les accents
//mysqli car mysql est obsolète (exemple sur ma base de données) pROGRAMMATION OBJET FACILE À TRANSFORMER EN PROCÉDURAL
$mysqli = new mysqli("localhost", "root", "", "lexique");	
//la requête d'origine
$requete = "SELECT count(DISTINCT mot) AS countmot FROM mots WHERE categorie = 'ADJ'";
// exécution
	$res = $mysqli->query($requete);
//lecture du résultat
	$res->data_seek(0);
		
	$row = $res->fetch_assoc();
		var_dump($row);
		$compte = $row['countmot'];
print "$compte";



?>

Re: Parse error dans une requête SQL

Posté : 21 nov. 2013, 16:28
par Herve_be
il me semble que les deux réponses que tu montre veulent sensiblement dire la même chose, non ?
Pas vraiment.
Si je pose ma question dans le sous-forum SQL on me répond qu'elle n'est pas à sa place car il s'agit d'une erreur de syntaxe PHP.
Si je pose ma question dans le sous-forum PHP on me répond qu'elle n'est pas à sa place car il s'agit de code SQL.
0 Parse error comme titre n'est pas très instructif.
J'ai modifié le titre
1 Impératif
passer à mysqli
Pas trop envie car le problème se pose pour ce seul statement; le reste du programme fonctionne très bien.
2
$countmot suppose une variable php déjà affectée. mMysql va quand même fonctionner
Comment faire pour affecter une variable avant l'appel (question peut-être simpliste mais nous sommes bien sur le forum "débutants"); mais je suppose que là n'est pas le problème, c'est un problème de syntaxe or je ne vois pas de guillemets intempestifs; je ne comprends pas où est l'erreur de syntaxe.

Re: Parse error dans une requête SQL

Posté : 21 nov. 2013, 18:53
par xTG
il me semble que les deux réponses que tu montre veulent sensiblement dire la même chose, non ?
Pas vraiment.
Si je pose ma question dans le sous-forum SQL on me répond qu'elle n'est pas à sa place car il s'agit d'une erreur de syntaxe PHP.
Si je pose ma question dans le sous-forum PHP on me répond qu'elle n'est pas à sa place car il s'agit de code SQL.
1) on te répond que ce n'est pas un problème SQL mais PHP
2) on te répond que c'est bien un problème PHP mais que tu ne nous montres pas de code PHP

Jamais on ne t'a répondu que tu étais dans la mauvaise catégorie. ;)
Conclusion : Montres nous ton code PHP. (et non pas seulement la requête SQL)

Re: Parse error dans une requête SQL

Posté : 21 nov. 2013, 19:09
par Herve_be
Pas compris ce que vous vouliez.
Toujours est-il que si je supprime cette fameuse ligne, ou plus exactement avant que j'ajoute cette seule ligne, il n'y avait pas d'erreur !
Enfin, voici l'ensemble du code, voir /* LIGNES AJOUTÉES */
select count(distinct choice) as $countrows from VTTlog where Date = $ListDate;
select count(*) as countrows from VTTlog;
j'avais mis la première ligne; comme ça ne fonctionnait pas je l'ai remplacée par la seconde, plus simple, qui ne fonctionne pas non plus.
<?php 
session_start(); // On démarre la session AVANT toute chose
if ($_SESSION['ID'] == "") die ('<br><img src="../gif/Stop.gif"><Font Color=Red>Accès non autorisé</Font>');
// connexion à la base
   $db = mysql_connect('rudyv.be.mysql', 'rudyv_be', 'le mot de passe')  or die('<img src="../gif/Stop.gif">Erreur de connexion '.mysql_error());
// sélection de la base  
   mysql_select_db('rudyv_be',$db)  or die('<img src="../gif/Stop.gif">Erreur de selection '.mysql_error());

$OneYearAgo = mktime(0,0,0,date("m"),date("d")-365,date("Y"));
$DateOYA=date("ymd", $OneYearAgo);

if (Date("Hi")<'1330')
	$NOW = mktime(0,0,0,date("m"),date("d"),date("Y"));
else
	$NOW = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
$DateNOW=date("ymd", $NOW);

/* Futur */

Echo "<TABLE BORDER CELLSPACING=1 CELLPADDING=2 WIDTH='900' ALIGN='center' BGCOLOR=Yellow><TBODY>";
$ListDate=" ";
$result = mysql_query("SELECT * FROM VTTlog WHERE Date>=$DateNOW ORDER BY Date DESC,choice DESC");  
while($row = mysql_fetch_array($result))
  {
  if ($ListDate <> $row['Date'])
  	{
	echo "<TR><TD WIDTH='10%'>".substr($row['Date'],-2)."/".substr($row['Date'],2,2)."/20".substr($row['Date'],0,2)."</TD>" ;
	$ListDate = $row['Date'];
	$ListChoice=" ";
	$lead="<TD WIDTH='10%'>";
	}
  if ($ListChoice <> $row['choice'])
  	{
	$ListChoice = $row['choice'];
	$Sep = "";
	switch ($ListChoice)
		{
		case "V":
			echo $lead."VTT</TD><TD WIDTH='80%'>";
			break;
		case "R":
			echo $lead."Route</TD><TD WIDTH='80%'>";
			break;
		case "N":
			echo $lead."Ne roule pas</TD><TD WIDTH='80%'>";
			break;
		case "A":
			echo $lead."Absent</TD><TD WIDTH='80%'>";
			break;
		default:
			echo $lead."? ".$ListChoice;
		}
	$lead="</TD></TR><TR><TD  WIDTH='10%'> </TD><TD  WIDTH='10%'>";
	}
  if($row['Comment']=="")
  	echo $Sep.$row['Name'] ;
  else
  	{
	$Comment=" <small>[".$row['Comment']."]</small>";
	echo $Sep.$row['Name'].$Comment;
	}

  $Sep = ", ";
  }
Echo "</Table></TD></TR></TBODY> ";

/* passé */

Echo "<TABLE BORDER CELLSPACING=1 CELLPADDING=2 WIDTH='900' ALIGN='center' BGCOLOR=Silver><TBODY>";
$ListDate=" ";
$result = mysql_query("SELECT * FROM VTTlog WHERE (Date>$DateOYA && Date<$DateNOW) ORDER BY Date DESC,choice DESC"); 
while($row = mysql_fetch_array($result))
  {
  if ($ListDate <> $row['Date'])
  	{
	echo "<TR><TD WIDTH='10%'>".substr($row['Date'],-2)."/".substr($row['Date'],2,2)."/20".substr($row['Date'],0,2)."</TD>" ;
	$ListDate = $row['Date'];
	$ListChoice=" ";

/* LIGNES AJOUTÉES */
	select count(distinct choice) as $countrows from VTTlog where Date = $ListDate;	
	select count(*) as countrows from VTTlog;					


	$lead="<TD WIDTH='10%' rowspan=".$countrows.">";
	}
  if ($ListChoice <> $row['choice'])
  	{
	$ListChoice = $row['choice'];
	$Sep = "";
	switch ($ListChoice)
		{
		case "V":
			echo $lead."VTT</TD><TD WIDTH='80%'>";
			break;
		case "R":
			echo $lead."Route</TD><TD WIDTH='80%'>";
			break;
		case "N":
			echo $lead."Ne roule pas</TD><TD WIDTH='80%'>";
			break;
		case "A":
			echo $lead."Absent</TD><TD WIDTH='80%'>";
			break;
		default:
			echo $lead."? ".$ListChoice;
		}
	$lead="</TD></TR><TR><TD  WIDTH='10%'> </TD><TD  WIDTH='10%'>";
	}
  if($row['Comment']=="")
  	echo $Sep.$row['Name'] ;
  else
  	{
	$Comment=" <small>[".$row['Comment']."]</small>";
	echo $Sep.$row['Name'].$Comment;
	}

  $Sep = ", ";
  }
Echo "</Table></TD></TR></TBODY> ";

	
// on ferme la connexion
mysql_close();   
		 
?> 

</body>
</html>
Pour expliquer ce que je veux faire,
dans le cadre d'un club vélo (c'est le cas de le dire) une DB contient l'agenda, un enregistrement par date, type d'activité, membre et commentaire éventuel
par exemple la DB contient pour le 16/11
16/11/2013 VTT FrançoisB
16/11/2013 VTT Sylvain
16/11/2013 Route Isabelle
16/11/2013 Ne roule pas Marie [comment]
16/11/2013 Ne roule pas Rudy [comment]
16/11/2013 Ne roule pas Jacques
16/11/2013 Ne roule pas Chantal
16/11/2013 Ne roule pas Christian
16/11/2013 Ne roule pas Francis
16/11/2013 Absent Jean-Marie

Actuellement, sans la ligne ajoutée, l'affichage donne
Image

en construisant la table affichée je voudrais compter le nombre d'entrées qui ont la même date et des activité distinctes (par exemple 4 pour le 16/11/2013) afin de mettre un colspan approprié dans le TD; c'est juste une question esthétique pour la première colonne.

Re: Parse error dans une requête SQL

Posté : 21 nov. 2013, 19:56
par xTG
Ah bah oui ça c'est du jolie parse error...
Pour caricaturer ce que tu as codé :
Tu as un pris une voiture fonctionnelle sur laquelle tu tentes de rajouter un pneu.

Sauf qu'un pneu tout seul ne va pas avec une voiture. Il faut un essieu et d'autres choses.

Dans ton cas tu as balancer une requête SQL dans du code PHP sans faire appel aux fonctions d’interaction(telles que mysql_query et mysql_fetch_array) avec le driver de ta base de données.
Un petit cours sur le sujet : http://www.phpdebutant.org/article66.php

Re: Parse error dans une requête SQL

Posté : 21 nov. 2013, 20:05
par Herve_be
Merci pour la réponse,
Ai-je bien compris que ceci devrait fonctionner ?
$sql = 'select count(distinct choice) as $countrows from VTTlog where Date = $ListDate';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

Re: Parse error dans une requête SQL

Posté : 21 nov. 2013, 21:11
par moogli
non cela peux fonctionner, mais ce n'est pas le cas car les variables ne sont pas interprétées dans une chaîne de caractères délimitées par des simple quote ( ' ).
il te manque la concaténation


@+

Re: Parse error dans une requête SQL

Posté : 22 nov. 2013, 10:21
par Herve_be
Bonjour,
Merci pour ta réponse.
Je connais et j'utilise en effet la concaténation, par exemple pour construire la table :
	$Comment=" <small>[".$row['Comment']."]</small>";
	echo $Sep.$row['Name'].$Comment;
Par contre j'utilise d'autres requètes SQL qui fonctionnent sans concaténation, par exemple
$result = mysql_query("SELECT * FROM VTTlog WHERE (Date>$DateOYA && Date<$DateNOW) ORDER BY Date DESC,choice DESC");
Serait-ce parce que j'utilise des doubles quotes ?
Dans ce cas, ceci devrait fonctionner non ?
$countrows = mysql_query("SELECT COUNT(DISTINCT Choice) FROM VTTlog WHERE Date = $ListDate") or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
En fait je n'ai plus de Parse error mais
$lead="<TD WIDTH='10%' rowspan=".$countrows.">";
echo $lead."VTT</TD>";
devient
<TD WIDTH='10%' rowspan=Resource id #8>VTT</TD>

Re: Parse error dans une requête SQL

Posté : 22 nov. 2013, 10:58
par moogli
1/ ne pas utiliser la concaténation rend le code moins clair et pas forcément plus performant (vu que la il faut que php parse la chaîne et y ajoute la bonne info contrairement a l'indication explicite de la concaténation).
2/ sauf si listedate contient des ' ta requête SQL n'est pas bonne.
3/ ressource parce que c'est le cas mysql_query retourne une ressource mysql et tu doit utiliser une fonction mysql _fetch_* pour obtenir les données.

@+

Re: Parse error dans une requête SQL

Posté : 22 nov. 2013, 11:55
par Herve_be
	$Resource = mysql_query("SELECT COUNT(DISTINCT Choice) FROM VTTlog WHERE Date = $ListDate") or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());					
	$countrows = mysql_fetch_*($Resource);
$countrows contient toujours 0 (zéro).
$ListDate contient une date, par exemple 131116
Si je supprime WHERE Date = $ListDate idem : $countrows contient toujours 0.

Re: Parse error dans une requête SQL

Posté : 22 nov. 2013, 19:48
par Herve_be
Bonsoir,
J'ai trouvé une solution beaucoup plus simple.

Je construisais la table avec des echo.
Puisque le rowspan est dans la première ligne, je devais d'abord compter le nombre de records avant de construire le reste de la table.
D'où appels répétés à Mysql.

Maintenant je construis la table dans un string; en même temps je compte le nombre de records.
Ensuite j'ajoute le rowspan DEVANT le string puis je fais echo de tout le string.

Je suis quand même curieux de connaître où était le problème du sql fetch.
Sinon, on peut clôturer, merci.