php/my sql erreur

debutantphp
Invité n'ayant pas de compte PHPfrance

20 mars 2012, 17:40

Bonjour a tous,
J'ai un ou plusieurs problemes avec mon code pour relier php avec mysql
<?php
include "includes/database.php";

print_r($_GET);


$id = $_GET['id'];

$query = "SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=$id";
//$query = "SELECT * FROM `Book` WHERE book_id=$id";
		$query2 = "SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=$id";

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if ($row = $result->fetch_assoc()) {
while ($row = $result->fetch_assoc()) {
echo "<h1>This works: $row[title]</h1>";
		
		
		$result = $abkg063->query($query2);
		if ($row = $result->fetch_assoc()) {
		while ($row = $result->fetch_assoc()) {
			echo "<h1>This works: $row[author]</h1>";
			
	
	?>
	
	<h2> this also works: <?php echo $row['title']?></h2>
	<img src="/imgages/book_covers/<?php echo $row['book_id']?>.jpg" width=200 height=300 >
	
	<?php
	
	print_r($row);
	// Print out book details
	echo "OK";
	} else {
	// No book found with such id
	echo "NOT FOUND!";


//SELECT * FROM Author WHERE Author.uthor_id=Book_author.author_id AND Book_author.book_id=$id
L'erreur qui s'affiche est celle ci
Parse error: syntax error, unexpected T_ELSE in /homes/2011/abkg063/html/Coursework/page3.php on line 39

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 mars 2012, 18:05

Il y a un problème logique dans la structure de lecture des 2 requêtes. Premièrement tu utilises mal les variables $result et $row qui ne peut malheureusement pas être utilisée pour lire 2 requêtes différentes imbriquées en cascade. Il faut donc utiliser une variable $result et $row pour exploiter la requête $query et une autre variable $result2 et $row2 pour $query2.
Le second problème est celui qui t'ai montré dans l'erreur que tu reçois et est relatif à la fin du IF et/ou du WHILE qui ne se terminent pas dans ton code il manque donc une accolade après le ELSE. Mais on en fait, il ne faut pas utiliser le IF comme ça si tu veux simplement afficher le message book "NOT FOUND!". Voici donc le correctif général:
<?php
include "includes/database.php";

print_r($_GET);


$id = $_GET['id'];

$query = "SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=$id";
//$query = "SELECT * FROM `Book` WHERE book_id=$id";

$query2 = "SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=$id";

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if (mysql_num_rows($result)>0) { //nbre d'enregistrements retournés par $query
  while ($row = $result->fetch_assoc()) {
      echo "<h1>This works: $row[title]</h1>";
               
               // deuxième requête
                $result2 = $abkg063->query($query2);
                if (mysql_num_rows($result2)>0) { //nbre d'enregistrements retournés par $query2
                   while ($row2 = $result2->fetch_assoc()) {
                        echo "<h1>This works: $row2['author']</h1>";
                     } //fin while pour $row2  
       
 ?>
       
        <h2> this also works: <?php echo $row['title']?></h2>
        <img src="/imgages/book_covers/<?php echo $row['book_id']?>.jpg" width=200 height=300 >
       
<?php
    } //fin while pour $row  
        print_r($row2);
        // Print out book details
        echo "OK";
 } else {
        // No book found with such id
        echo "NOT FOUND!";
}
 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

debutantphp
Invité n'ayant pas de compte PHPfrance

21 mars 2012, 10:31

Merci!
Cependant j''ai maintenant une autre erreur qui s'affiche " Parse error: syntax error, unexpected T_ELSE in /homes/2011/abkg063/html/Coursework/page3.php on line 39 "
<?php
include "includes/database.php";

print_r($_GET);


$id = $_GET['id'];

$query = "SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=$id";
//$query = "SELECT * FROM `Book` WHERE book_id=$id";

$query2 = "SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=$id";

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if (mysql_num_rows($result)>0) { //nbre d'enregistrements retournés par $query
  while ($row = $result->fetch_assoc()) {
      echo "<h1>This works: $row[title]</h1>";
               
               // deuxième requête
                $result2 = $abkg063->query($query2);
                if (mysql_num_rows($result2)>0) { //nbre d'enregistrements retournés par $query2
                   while ($row2 = $result2->fetch_assoc()) {
                        echo "<h1>This works: $row2['author']</h1>";
                     } //fin while pour $row2  
       
 ?>
       
        <h2> this also works: <?php echo $row['title']?></h2>
        <img src="/imgages/book_covers/<?php echo $row['book_id']?>.jpg" width=200 height=300 >
       
<?php
    } //fin while pour $row  
        print_r($row2);
        // Print out book details
        echo "OK";
 } else {
        // No book found with such id
        echo "NOT FOUND!";
}

ViPHP
xTG
ViPHP | 7331 Messages

21 mars 2012, 10:49

Il te manque une accolade fermante.
Indentes ton code et tu y verras plus clair et cela te permettra d'éviter ce genre d'erreur.

ViPHP
ViPHP | 2577 Messages

21 mars 2012, 10:52

Il manque des accolades fermetures.

Je te conseille de bien indenter ton code pour suivre les blocs de traitement et voir ou ils se chevauchent.

(pas assez rapide^^)

debutantphp
Invité n'ayant pas de compte PHPfrance

21 mars 2012, 11:01

Ok merci! ca a résolu cette erreur, mais j'ai une autre erreur qui s"affiche maintenant

Parse error: syntax error, unexpected T_ELSE in /homes/2011/abkg063/html/Coursework/includes/bookDetails.php on line 41

<?php
include "database.php";

print_r($_GET);


$id = $_GET['id'];

$query = "SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=$id";
//$query = "SELECT * FROM `Book` WHERE book_id=$id";

$query2 = "SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=$id";

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if (mysql_num_rows($result)>0) { //nbre d'enregistrements retournés par $query
while ($row = $result->fetch_assoc()) {
echo "<h1>This works: $row[title]</h1>";

// second query
$result2 = $abkg063->query($query2);
if (mysql_num_rows($result2)>0) { //nbre d'enregistrements retournés par $query2
while ($row2 = $result2->fetch_assoc()) {
echo " <h1>This works:'$row2[author]'</h1> ";
} //end while for $row2


?>

<h2> this also works: <?php echo $row['title']?></h2>
<img src="/imgages/book_covers/<?php echo $row['book_id']?>.jpg" width=200 height=300 >

<?php
} //fin while pour $row
print_r($row2);
// Print out book details
echo "OK";
} else {
// No book found with such id
echo "NOT FOUND!";
}
}

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 mars 2012, 11:07

Excuse moi j'ai oublié de mettre une accolade pour le deuxième IF. Tu vois quand il y a un mélange de while et if il faut être vigilant et réviser la structure pour que tout WHILE commence par { et se termine par } et de même tout IF doit avoir ses { ... } de même tout ELSE doit commencer par { et finir par }. C'est comme ça la syntaxe.
En plus, quand un IF est imbriqué dans un WHILE (se trouve dedans) il faut d'abord terminer le IF avant de terminer le WHILE et vis-versa.

Exemple 1: Respect du WHILE:
==========================

Code : Tout sélectionner

WHILE (condition logique) { ..... traitement .... }
Exemple 2: Respect du IF/ELSE:
============================

Code : Tout sélectionner

IF (condition logique) { ... traitement ...} ELSE { ... traitement ... }
Exemple 3: Imbrication du IF dans le WHILE:
======================================

Code : Tout sélectionner

WHILE (condition logique) { ..... traitement du while commence .... IF (condition logique) { ... traitement du if ...} ELSE { ... traitement du else ... } ..... traitement du while continue .... }
Exemple 4: Imbrication du WHILE dans le IF:
======================================

Code : Tout sélectionner

IF (condition logique) { ..... traitement du IF commence .... WHILE (condition logique) { ... traitement du while ...} ..... traitement du IF continue .... } ELSE { ... traitement du else qui peut être structuré comme celui du IF etc... }
Finalement voici le corrigé de ton code:
<?php
include "includes/database.php";

print_r($_GET);


$id = $_GET['id'];

$query = "SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=$id";
//$query = "SELECT * FROM `Book` WHERE book_id=$id";

$query2 = "SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=$id";

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if (mysql_num_rows($result)>0) { //nbre d'enregistrements retournés par $query
  while ($row = $result->fetch_assoc()) {
      echo "<h1>This works: $row[title]</h1>";
               
               // deuxième requête
                $result2 = $abkg063->query($query2);
                if (mysql_num_rows($result2)>0) { //nbre d'enregistrements retournés par $query2
                   while ($row2 = $result2->fetch_assoc()) {
                        echo "<h1>This works: $row2['author']</h1>";
                     } //fin while pour $row2  
                } //fin if pour $result2
 ?>
       
        <h2> this also works: <?php echo $row['title']?></h2>
        <img src="/imgages/book_covers/<?php echo $row['book_id']?>.jpg" width=200 height=300 >
       
<?php
    } //fin while pour $row  

    // Print out book details
    echo "OK";
 }  //fin if pour $result
else {
        // No book found with such id
        echo "NOT FOUND!";
}
Je te conseille de compter les accolades ouvrantes et fermantes de ton programme et il faut que le nombre des ouvrantes soit le même que celui des fermantes et que toute accolade fermante } rencontrée ferme la première accolade ouvrante { qui la précède dans la séquence.

Je te conseille aussi d'utiliser un bon éditeur de code php qui te permettra de bien maitriser l'indentation et les blocs structurés du IF, WHILE, ...

Editeurs comme : NetBeans IDE pour PHP, Eclipse, Code Lobster pour PHP, PHPedit, ....
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

debutantphp
Invité n'ayant pas de compte PHPfrance

21 mars 2012, 11:25

Merci, mais il y a encore une autre erreur qui s'affiche, je pense que elle est du a " echo "<h1>This works: $row2['author']</h1>";" ou il faut mettre 'author' entre simple guillemets, mais ca ne marche pas.

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /homes/2011/abkg063/html/Coursework/includes/bookDetails.php on line 27

<?php
include "includes/database.php";

print_r($_GET);


$id = $_GET['id'];

$query = "SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=$id";
//$query = "SELECT * FROM `Book` WHERE book_id=$id";

$query2 = "SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=$id";

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if (mysql_num_rows($result)>0) { //nbre d'enregistrements retournés par $query
while ($row = $result->fetch_assoc()) {
echo "<h1>This works: $row['title']</h1>";

// deuxième requête
$result2 = $abkg063->query($query2);
if (mysql_num_rows($result2)>0) { //nbre d'enregistrements retournés par $query2
while ($row2 = $result2->fetch_assoc()) {
echo "<h1>This works: $row2['author']</h1>";
} //fin while pour $row2
} //fin if pour $result2
?>

<h2> this also works: <?php echo $row['title']?></h2>
<img src="/imgages/book_covers/<?php echo $row['book_id']?>.jpg" width=200 height=300 >

<?php
} //fin while pour $row
print_r($row2);
// Print out book details
echo "OK";
} //fin if pour $result
else {
// No book found with such id
echo "NOT FOUND!";
}

ViPHP
ViPHP | 2577 Messages

21 mars 2012, 11:37

echo '<h1>This works: ',$row2['author'],'</h1>';

Je crois que les tableaux passe mal dans les chaines entre double quote ; à moins d'écrire ${row2['author']} mais pas sur. Le plus simple est de les sortir et d'utiliser des simple quote puisque pas de variable..

debutantphp
Invité n'ayant pas de compte PHPfrance

21 mars 2012, 11:53

j'ai essayé les deux manieres et j'ai toujours la meme erreur qui s'affiche :(

ViPHP
ViPHP | 2577 Messages

21 mars 2012, 12:42

En regardant le code je n'ai pas vu de problème. Mais tu as 2 echo avec des tableaux, as tu modifié les 2 ?

Tu peux essayer de mettre la ligne qui pose problème en commentaire pour voir ce que ca donne.

debutantphp
Invité n'ayant pas de compte PHPfrance

21 mars 2012, 13:07

oui j'ai modifié les deux echo et ca fait la meme erreur
ça fait l'erreur aussi quand je les mets en commentaire

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 mars 2012, 15:17

Coucou c'est encore moi à la rescousse.
<?php
include "includes/database.php";

print_r($_GET);


$id = $_GET['id'];

$query = 'SELECT * FROM `Book`, `Publisher` WHERE Book.publisher_id = Publisher.publisher_id AND Book.book_id=' . $id;
//$query = "SELECT * FROM `Book` WHERE book_id=$id";

$query2 = 'SELECT * FROM `Author` WHERE Author.author_id = Author.author_id=' . $id;

//print $query;
//print $abkg063->error;

// perform the query
$result = $abkg063->query($query);
if (mysql_num_rows($result)>0) { //nbre d'enregistrements retournés par $query
  while ($row = $result->fetch_assoc()) {
      echo '<h1>This works: ' . $row['title'] . '</h1>';
               
               // deuxième requête
                $result2 = $abkg063->query($query2);
                if (mysql_num_rows($result2)>0) { //nbre d'enregistrements retournés par $query2
                   while ($row2 = $result2->fetch_assoc()) {
                        echo '<h1>This works: ' . $row2['author'] . '</h1>';
                     } //fin while pour $row2  
                } //fin if pour $result2
 ?>
       
        <h2> this also works: <?php echo $row['title']; ?></h2>
        <img src="/imgages/book_covers/<?php echo $row['book_id']; ?>.jpg" width=200 height=300 >
       
<?php
    } //fin while pour $row  

    // Print out book details
    echo 'OK';
 }  //fin if pour $result
else {
        // No book found with such id
        echo 'NOT FOUND!';
}
On ne peut pas mettre une variable tableau (comme $row['author']) dans une chaine avec des guillemets comme on peut le faire pour une variable simple comme $id. Mais il faut soit l'inclure entre { } dans la chaine comme :
 echo "<h1>This works: {$row2[author]} </h1>";
(remarque: l'index 'author' perd ses délimiteurs ' ' dans ce cas car il est déjà dans une chaine)
ou bien la faire sortir de la chaine en procédant à une concaténation (collage) comme :
echo '<h1>This works: ' . $row2['author'] . '</h1>';
(remarque: l'index 'author' est délimité entre ' ' dans ce cas car il est hors chaine)

Cependant, la méthode qui consiste à intégrer les variables dans une chaine de caractères délimitée entre guillemets " " est très couteuses en ressources d'exécution comme :
echo "<h1>This works: {$row2[author]}</h1>";
car l'interpréteur/exécuteur PHP doit analyser la chaine pour en exploiter effectivement les variables intégrés et ça augmente le temps d'exécution. Alors que si la chaine est entre quotte (') (ou apostrophe) et a été déjà dissociée des variables dans le programme comme ici:
echo '<h1>This works: ' . $row2['author'] . '</h1>';
l'exécuteur n'aura pas à perdre de temps dans l'analyse de la chaine et exécute directement en évaluant les variables et construisant la chaine finale.

Donc finalement c'est la dernière forme qu'il faut retenir:
echo '<h1>This works: ' . $row2['author'] . '</h1>';
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

debutantphp
Invité n'ayant pas de compte PHPfrance

23 mars 2012, 00:21

merci pour l'aide, ca à résolu cette erreur mais il y a encore une autre qui apparait.. il faut que je revoit encore le code. Merci pour tout

Mammouth du PHP | 2278 Messages

23 mars 2012, 19:35

C'es-t bien pour cette raison que je préfère:
if (condition)//______________________ le cadeau est en or
{
    traitement si la condition est remplie
    while ( condition de continuation) // tant que l'or dure
    {
        traitement dans le while
     } // fin de while
}
else // ____________________________ le cadeau n'est pas en or
{
    traitement si la condition n'est pas remplie
} //fin de if
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD