PHP-sortering fungerar inte korrekt, HJÄLP!

Permalänk

PHP-sortering fungerar inte korrekt, HJÄLP!

Hejsan,
Har ett litet problem med nedanstående PHP-kod. Den lagrar nämligen allting i dubletter.

<?php
db_connect ();
/* Sorterar filmer! */
if (isset($_GET['sort'])) {
$sort = $_GET['sort'];
$query2 = "SELECT * FROM tbl_film, tbl_regissor ORDER BY $sort ASC";
$result = mysql_query($query2);
}
else{
$query = "SELECT * FROM tbl_film, tbl_regissor";
$result = mysql_query($query);
}
print"<table>";
print"<tr><th><p><a href='?sort=Titel'>Film:</a></p></th>";
print"<th><p><a href='?sort=regissor'>Regissör:</a></p></th>\n";
print"<th><p><a href='?sort=Produktionsar'>År:</a></p></th>\n";

print"</tr>\n";
while ($row = mysql_fetch_array($result)){

print "<tr>\n";
$Titel = $row['Titel'];
$regissor = $row['regissor'];
$Produktionsar = $row['Produktionsar'];

print "<td>$Titel</td>";
print "<td>$regissor</td>\n";
print "<td>$Produktionsar</td>\n";
print "</tr>\n";
}
print "</table>";
?>

Bifogar en bild på fenomenet så att ni ska få en klarare bild på vad det rör sig om!

All hjälp vore uppskattat!

Permalänk

Problemet ligger i queryn, du kan inte hämta från två tabeller samtidigt utan att göra en INNER JOIN.
Vilket också innebär att du måste ha ett fält i tbl_film, tex "regissorID", som innehåller det unika ID för den regissör i tbl_regissor som gjort filmen. Sedan kan du köra en query i denna stilen:

SELECT * FROM tbl_film a INNER JOIN tbl_regissor b ON a.regissorID = b.id ORDER BY $sort ASC

(förutsatt att nu fälten heter regissorID samt id såklart)

Permalänk
Inaktiv

Tänk även på att köra mysql_real_escape_string() på saker du lägger till i querien med ($sort), annars kan folk ändra på din fråga genom SQL-injection.

Permalänk

Fältet i tbl_film heter "Regissor_id". Ska jag göra en INNER JOIN på båda queryes eller bara en utav dem?
Tack för hjälpen!

Permalänk
Medlem

SELECT * FROM tbl_film inner join tbl_regissor on tbl_film.Regissor_id = tbl_regissor.id ORDER BY $sort ASC
SELECT * FROM tbl_film inner join tbl_regissor on tbl_film.Regissor_id = tbl_regissor.id

Dessa borde funka om columnnamnen är korrekt uppfattade.

Permalänk

Tack så jättemycket, nu fungerar det klockrent!
Jag märkte av ett annat fel nu dock, filmer med exakt samma namn, produktionsår samt regissör kan lagras - det ska inte vara möjligt att lagra exakta dubletter på det sättet.

<?php
include("db.inc.php");
db_connect();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="sv-se">
<head>
<title>Filmdatabasen</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1><center><strong>Filmdatabasen</strong></center></h1>
<div id="container">
<div id="header">
</div>
<div id="meny">
<ul>
<li><a href="Start.html">Start</a></li>
<li><a href="laggTillregissor.php">Lägga till regissör</a></li>
<li><a href="taBort.php">Ta bort regissör</a></li>
<li><a href="laggTillfilm.php">Lägga till film</a></li>
<li><a href="taBortfilm.php">Ta bort film</a></li>
<li><a href="Sort.php">Sortera</a></li>
</ul>
</div>
<div id="huvudsida">
<br/>
<br/>
<br/>
<?php
db_connect ();
/* Undersöker om fälten är tomma samt kollar om siffror/bokstäver är ifyllda i korrekta rutor.
Om inga fel hittas går scriptet vidare och informationen lagras i databasen. */
if (isset($_POST['submit'])) {
$Titel = trim($_POST['Titel']);
$Produktionsar = $_POST['Produktionsar'];
if (!empty($Titel) and !empty($Produktionsar) and is_numeric($Produktionsar)) {

$Produktionsar = mysql_real_escape_string(htmlspecialchars ($_POST['Produktionsar']));
$Titel = mysql_real_escape_string(htmlspecialchars ($_POST['Titel']));
$Regissor_id = ($_POST['Regissor_id']);

$query="INSERT INTO tbl_film ( Produktionsar, Titel, Regissor_id)VALUES ('$Produktionsar','$Titel', '$Regissor_id')";
mysql_query($query);
print ("<h4>Lyckades!</h4>");
}
}
?>
<h3>Lägg till film!</h3>
<form action="" method="post" id="form1">
<p class="white">Titel:<input type="text" id="form_title" name="Titel"/> <span id="feedback1"> minst 1 tecken! </span></p>
<p class="white">Tillverkad:<input type="text" id="form_year" name="Produktionsar"/> <span id="feedback2">Årtal efter 1918!</span></p>
<p><select name="Regissor_id">
<?php
$query = "SELECT * FROM tbl_regissor";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)){
$regissor = $row['regissor'];
$id = $row['id'];
print "<option value='$id'>$regissor</option>";
}
?>
</select></p>

<p><input type="submit" name="submit" value="Lägg till" /></p></form>
</div>
</div>
<script src="FilmJS.js" type="text/javascript" charset="utf-8">

</script>
</body>
</html>

Vad är det som ska ändras i den koden för att förhindra att filmer med exakt samma namn, produktionsår och regissör kan lagras flera gånger? Förklara väldigt gärna var jag gjorde/tänkte fel!

Permalänk

Jag känner till UNIQUE CONSTRAINT, men om jag använder mig utav det kan väl två filmer med samma namn och olika årtal inte lagras, så det är ett "no go".
All hjälp vore på sin plats, tack på förhand!

Permalänk
Medlem

För att undvika att en film med samma namn, år och regissör lagras så måste du först kontrollera ifall en post med samma uppgifter redan finns innan registrering.

Permalänk

Hur gör jag det då? Förlåt för alla frågor, men är relativt nyinsatt vad gäller programmering, så har blivit otroligt mycket "trial and error", dock så har jag sakta men säkert börjat lära mig en hel del.
Vad är det för kodsnutt som ska ändras/läggas till?

Tack!

Permalänk
Medlem

http://php.net/manual/en/function.mysql-num-rows.php Den här funktionen borde kunna hjälpa dig. Om resultatet == 0 så är det bara att lägga till en ny, annars så finns filmen redan.

Permalänk

Det låter lätt, men hur gör jag för att implementera den där funktionen? Provade mig fram nyss, men inga framsteg, kan fortfarande lagra dubbletter.

Hur ska det korrekta kodstycket som förhindrar detta se ut?

Permalänk
Medlem

Du kan göra ett fält i MySQL till unique vilket gör att MySQL ger ett error (duplicate key) om du försöker lagra dubbletter.
Sen när du kör en insert genom PHP kan du använda dig av mysql_affected_rows() för att se om nya raden skapades eller ej.

Edit: Du kan även sätta unique på flera fält tillsammans. T.ex unique(`name`, `year`, `director`)

Permalänk
Medlem
Skrivet av jonke:

http://php.net/manual/en/function.mysql-num-rows.php Den här funktionen borde kunna hjälpa dig. Om resultatet == 0 så är det bara att lägga till en ny, annars så finns filmen redan.

Skrivet av Mr.Awesome:

Det låter lätt, men hur gör jag för att implementera den där funktionen? Provade mig fram nyss, men inga framsteg, kan fortfarande lagra dubbletter.

Hur ska det korrekta kodstycket som förhindrar detta se ut?

För att kontrollera så inga dubletter lägs in så gör en query som söker i databasen efter år, namn, regisör etc.
Sen kör du http://php.net/manual/en/function.mysql-num-rows.php så det blir == 0.

Exempel:

$query = mysql_query(SELECT * FROM filmer WHERE namn=$namn AND regisor=$regisor AND year=$year); if(mysql_num_rows($query) !=0) error(); else add_film();

Permalänk

Tack så jättemycket för hjälpen, fixade det nu!