2010-10-24 6 views
0

Je joue avec PHP/MySQL et j'essaie de m'enseigner en ligne, mais je n'arrive pas à comprendre cela pour la vie de moi.Une erreur PHP MySQL que je ne peux pas résoudre

J'ai suivi un tutoriel PHP à http://www.keithjbrown.co.uk/vworks/php/php_p5.php

Cette page est à tasmanianracing.com/horses.php

Je reçois l'erreur MySQL suivante:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (horses.horseID =)' at line 1

qui est levé de ma fonction update_horse()

Mon code est ci-dessous - si quelqu'un pouvait m'aider je serais toujours gra teful!

<html> 
<head> 
<title>Horses | Horse Database</title> 
</head> 

<body> 

<?php 

if (!$_REQUEST['Submit']) { 
html_form(); 
} elseif ($_REQUEST['Submit'] == "View Horse") { 
select_horse(); 
} elseif ($_REQUEST['Submit'] == "Edit") { 
get_data(); 
} elseif ($_REQUEST['Submit'] == "Update") { 
update_horse(); 
} 

function my_conn() { 

/* sets the variables for MySQL connection */ 

$server = "***"; // this is the server address and port 
$username = "***"; // this is the mysql username 
$password = "***"; // this is the mysql password 

/* connects to the MySQL server */ 

$link = @mysql_connect ($server, $username, $password) 
or die (mysql_error()); 

/* defines the active database for the connection */ 

if ([email protected]_select_db("tashorse_tasform", $link)) { 

echo "<p>There has been an error. This is the error message:</p>"; 
echo "<p><strong>" . mysql_error() . "</strong></p>"; 
echo "Please contact your systems administrator with the details"; 

} 

return $link; 

} 

function html_form() { 

?> 

<p>Please enter the search term for the horse</p> 

<form name="horsesearch" method="post" action="<? echo $_SERVER['PHP_SELF']; ?>"> 
Name of horse: <input type="text" name="horse_name"> 
<input type="submit" name="Submit" value="View Horse" /> 
</form> 

<? 

} 

function select_horse() { 
?> 
<h4>Horse Search</h4> 
<? 

$conn = my_conn(); 

/* Sets the SQL Query */ 

$sql = "SELECT * FROM horses"; 
$sql .= " WHERE (horses.horse_name = '{$_POST['horse_name']}')"; 

/* Passes a Query to the Active Database */ 

$result = mysql_query($sql, $conn); 
if (!$result) { 
echo("<p>Error performing query: " . mysql_error() . "</p>"); 
exit(); 
} 

/* starts the table and creates headings */ 

?> 

<table> 
<tr> 
<td><strong>Horse Name</strong></td> 
<td><strong>Year Foaled</strong></td> 
<td><strong>Trainer</strong></td> 
<td><strong>Owners</strong></td> 
<td><strong>Silks</strong></td> 
<td></td> 
</tr> 

<? 
/* retrieves the rows from the query result set and puts them into 
a HTML table row */ 

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
echo("<tr><td>" . $row["horse_name"] . "</td>"); 
echo("<td>" . $row["year_foaled"] . "</td>"); 
echo("<td>" . $row["trainer"] . "</td>"); 
echo("<td>" . $row["owners"] . "</td>"); 
echo("<td>" . $row["silks"] . "</td>"); 
echo("<td><a href=\"" . $_SERVER['PHP_SELF'] . "?horseID=" .$row['horseID'] . "&Submit=Edit\">Edit</a></td></tr>"); 
} 

/* closes the table */ 
?> 
</table> 
<? 

/* closes connection to the MySQL server */ 

mysql_close ($conn); 

/* Displays HTML Form */ 
html_form(); 

} 

function get_data() { 

/* Calls our connection function */ 

$conn = my_conn(); 

/* Defines query */ 

$sql = "SELECT * FROM horses WHERE (horses.horseID = " . $_REQUEST['horseID'] . ")"; 

/* Passes query to database */ 

$result = mysql_query($sql, $conn); 
if (!$result) { 
echo("<p>Error performing query: " . mysql_error() . "</p>"); 
exit(); 
} 

/* creates our row array with an if statement to report errors */ 

if ($row = @mysql_fetch_array($result, MYSQL_ASSOC)) { 

/* prints out the horse name */ 

print "<h4>$row[horse_name]</h4>"; 

/* prints out our HTML form '\"' */ 

print "<form name=\"horseupdate\" method=\"post\" action=\"$_SERVER[PHP_SELF]\">"; 

/* prints out our HTML table and fields 'escaping' any double quotes '\"' */ 

print "<table width=\"600\"> 

<tr> 
<td width=\"150\"><strong>Horse Name</strong></td> 
<td width=\"350\"><input type=\"hidden\" name=\"horse_name\" value=\"$row[horse_name]\"></td> 
<td rowspan=\"5\" valign=\"top\"> 
<input type=\"submit\" name=\"Submit\" value=\"Update\"> 
</td> 
</tr> 

<tr> 
<td width=\"150\"><strong>Year Foaled</strong></td> 
<td width=\"350\"><input type=\"text\" size =\"4\" name=\"year_foaled\" value=\"$row[year_foaled]\"></td> 
</tr> 

<tr> 
<td width=\"150\"><strong>Trainer</strong></td> 
<td width=\"350\"><input type=\"text\" size =\"40\" name=\"trainer\" value=\"$row[trainer]\"></td> 
</tr> 

<tr> 
<td width=\"150\"><strong>Owners</strong></td> 
<td width=\"350\"><input type=\"text\" size =\"40\" name=\"owners\" value=\"$row[owners]\"></td> 
</tr> 

<tr> 
<td width=\"150\"><strong>Silks</strong></td> 
<td width=\"350\"><input type=\"text\" size =\"40\" name=\"silks\" value=\"$row[silks]\"></td> 
</tr> 

</table> 
</form>"; 

} else { 
echo("There has been an error" . mysql_error()); 
} 

/* closes connection */ 

mysql_close ($conn); 

} 

function update_horse() { 

/* Calls our connection function */ 

$conn = my_conn(); 

/* Defines query */ 

$sql_update = "UPDATE horses SET "; 
$sql_update .= "horses.year_foaled = '" . $_REQUEST['year_foaled'] . "', "; 
$sql_update .= "horses.trainer = '" . $_REQUEST['trainer'] . "', "; 
$sql_update .= "horses.owners = '" . $_REQUEST['owners'] . "', "; 
$sql_update .= "horses.silks = '" . $_REQUEST['silks'] . "', "; 
$sql_update .= "WHERE (horses.horseID = " . $_REQUEST['horseID'] . ")"; 

/* Passes query to database */ 

$result = mysql_query($sql_update, $conn); 
if (!$result) { 
echo("<p>Error performing query: " . mysql_error() . "</p>"); 
exit(); 
} 

/* Prints success message */ 

print "<p> Successfully Updated</p>"; 

/* closes connection */ 

mysql_close ($conn); 

/* Calls get_data() function */ 

getdata(); 

} 

?> 

</body> 
</html> 
+4

Bonjour les petites tables Bobby: http://bobby-tables.com/ – Quentin

+1

Juste une note rapide; ne publiez jamais d'informations d'identification de sécurité (c'est-à-dire, nom d'utilisateur et mot de passe pour votre base de données). –

+1

en référence au commentaire ci-dessus - la requête que vous exécutez est susceptible d'injection SQL. Vous devriez nettoyer l'entrée avant de la placer dans une requête - regardez mysql_escape_string http://php.net/manual/fr/function.mysql-escape-string.php –

Répondre

2

Votre formulaire de mise à jour ne dispose pas d'un élément avec name = « horseID », que votre fonction de mise à jour tente d'utiliser pour spécifier quel cheval mettre à jour. Vous avez un champ de nom caché là!

1

Il semble que la variable horseID n'a pas été définie dans le formulaire qui est publié dans le script de mise à jour, vous pouvez le voir facilement si vous avez généré votre requête SQL. Vous avez vraiment besoin de regarder aussi à désinfecter vos variables avant de les utiliser dans une requête en utilisant mysql_real_escape_string et en utilisant $_GET ou $_POST sur $_REQUEST. Si cela est basé sur un tutoriel - vous devriez vraiment en utiliser un autre car il y a tellement de mauvaises pratiques dans votre code que c'est vraiment très effrayant

+0

Merci pour votre réponse - votre commentaire sur le tutoriel étant nul m'a demandé si vous pouvez recommander quelque chose en ligne pour moi de travailler avec? Merci encore –

1

Première chose à faire lors du débogage de ce genre de problème: découvrez exactement ce que SQL déclaration que vous essayez d'exécuter. Mettez un echo $sql_update avant de l'exécuter et assurez-vous qu'il fait ce que vous voulez. Ensuite, vous pouvez commencer à localiser le problème. Le commentaire 'Tables Bobby' est une personne essayant de vous dire que vous devez également échapper à l'entrée de l'utilisateur. Utilisez mysql_real_escape_string pour vous assurer que la saisie par l'utilisateur ne peut pas être utilisée pour attaquer votre site Web.

+0

Merci à tout le monde, mais celui-ci m'a définitivement dépassé. En écho la mise à jour de sql m'a montré que j'avais une virgule supplémentaire qui cassait la mise à jour. –

1

Remplacer

<input type=\"hidden\" name=\"horse_name\" value=\"$row[horse_name]\">

avec

<input type=\"hidden\" name=\"horseID\" value=\"$row[horseID]\">

Il ne semble pas que vous avez besoin nom de cheval partout dans votre mise à jour.

Questions connexes