probleem met meerdere afbeeldingen

  • Onderwerp starter Onderwerp starter Niro
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Niro

Gebruiker
Lid geworden
5 jan 2007
Berichten
20
Hallo

Sinds vorige week ben ik begonnen met PHP, ik ben een website aan het maken voor iemand die auto's verkoopt: www.cwint.be.

In een admin-gedeelte is er de mogelijkheid om een auto toe te voegen aan de database, in een tabel autos, met velden auto_id (auto increment), merk, type, prijs, ....
Ook kun je in het formuliertje meerdere foto's toevoegen. Al deze foto's worden geupload naar een map op de server en een path wordt in een tabel 'images', met velden id, image en auto_id (deze neemt automatisch de auto_id over van de tabel autos).

Als je op cwint.be naar Autoverkoop gaat, zie je dat auto's met meerdere foto's meerdere keren tevoorschijn komen met de bijhorende afbeeldingen.

Natuurlijk mag een auto maar 1 keer getoond worden met 1 van de afbeeldingen die erbij geupload werden.

Nu is mijn vraag hoe ik dit het best doe, want ik heb al vanalles geprobeerd.
 
ik heb net ff gekeken en ik geloof dat je het opgelost hebt :thumb:
 
Nee is nog niet opgelost, zoals je kan zien staat er 2x Fiat 987 met elk een andere foto. Die mag er dus maar 1x keer staan met een van die 2 foto's die ik bij de auto heb geupload.
 
Laten we dan eerst beginnen met een stuk code waar jij denkt dat de fout zit, want anders kunnen we niet zoveel doen :P
 
Laten we dan eerst beginnen met een stuk code waar jij denkt dat de fout zit, want anders kunnen we niet zoveel doen :P

Ok :D

De pagina Autoverkoop bestaat dus uit volgende code:

PHP:
<?php include('config.php'); ?>
<html>
<head>
<style type="text/css">
.style5 {
	border: 1px solid #000000;
	font-size:13px;
}
.style6 {
	border: 1px solid #000000;
	background-color: #EAEAEA;
	font-size:13px;
}
</style>
</head>
<h1>Auto's</h1>
<?
$query = mysql_query("SELECT * FROM autos, images WHERE autos.auto_id = images.auto_id ORDER BY autos.auto_id DESC ");
while($auto = mysql_fetch_array($query)){
echo "
<table width=\"760\">
	<tr>
		<td colspan=\"5\" align=\"center\" class=\"style6\"><b><a href=\"?pg=detail&auto_id=".$auto['auto_id']."\">".$auto['merk']." ".$auto['type']."</a></b></td>
	</tr>
	<tr>
		<td style=\"width: 20%\" rowspan=\"2\" align=\"center\" class=\"style5\"><a href=\"admin/uploaded/".$auto['image']."\" target=\"_blank\"><img src=\"admin/uploaded/".$auto['image']."\" height=\"100\"></a></td>
		<td style=\"width: 20%\" align=\"center\" class=\"style5\"><b>&euro; ".$auto['prijs']."<b></td>
		<td style=\"width: 20%\" align=\"center\" class=\"style5\"><b>".$auto['km']." km<b></td>
		<td style=\"width: 20%\" align=\"center\" class=\"style5\"><b>".$auto['bouwjaar']."<b></td>
		<td style=\"width: 20%\" align=\"center\" class=\"style5\"><b>".$auto['vermogen']." PK<b></td>
	</tr>
	<tr>
		<td  colspan=\"4\" class=\"style5\"><b>Brandstof:</b> ".$auto['brandstof']."<br /><b>Kleur:</b> ".$auto['kleur']."</td>
	</tr>
	<tr>
		<td colspan=\"5\" align=\"center\" class=\"style6\"><b><a href=\"?pg=detail&auto_id=".$auto['auto_id']."\">Meer info</a></b></td>
	</tr>
</table><br />
";
}
?>
<br />
</html>

Volgens mij zit er hier wel ergens een fout in, ofwel de manier waarop de afbeeldingen worden toegevoegd aan de database:

PHP:
<?php
$merk=$_POST[merk];
$type=$_POST[type];
$carroserietype=$_POST[carroserietypetype];
$vermogen=$_POST[vermogen];
$brandstof=$_POST[brandstof];
$verbruik=$_POST[verbruik];
$kleur=$_POST[kleur];
$bouwjaar=$_POST[bouwjaar];
$transmissie=$_POST[transmissie];
$versnellingen=$_POST[versnellingen];
$cilinderinhoud=$_POST[cilinderinhoud];
$deuren=$_POST[deuren];
$opties=$_POST[opties];
$prijs=$_POST[prijs];
$km=$_POST[km];
$opslaan=$_POST[opslaan];

if (isset($opslaan)) {
    $sql3="INSERT INTO autos(merk, type, bouwjaar, brandstof, verbruik, prijs, carroserietype, vermogen, kleur, opties, transmissie, versnellingen, cilinderinhoud, deuren, km) VALUES('$merk', '$type', '$bouwjaar', '$brandstof', '$verbruik', '$prijs', '$carroserietype', '$vermogen', '$kleur', '$opties', '$transmissie', '$versnellingen', '$cilinderinhoud', '$deuren', '$km')";
	mysql_connect("...","...","..."); // mysql_connect("plaatsvandatabase","loginaanm","paswoord");
	mysql_select_db("geysensm"); // mysql_select_db("naamvandatabase");
   	$result = mysql_query("$sql3");
	$auto_id = mysql_insert_id();
	$number_of_file_fields = 0;
    $number_of_uploaded_files = 0;
    $number_of_moved_files = 0;
    $uploaded_files = array();
    $upload_directory = dirname(__file__) . '/uploaded/'; //set upload directory
    /**
     * we get a $_FILES['images'] array ,
     * we procee this array while iterating with simple for loop 
     * you can check this array by print_r($_FILES['images']); 
     */
    for ($i = 0; $i < count($_FILES['images']['name']); $i++) {
        $number_of_file_fields++;
        if ($_FILES['images']['name'][$i] != '') { //check if file field empty or not
            $number_of_uploaded_files++;
            $uploaded_files[] = $_FILES['images']['name'][$i];
            if (move_uploaded_file($_FILES['images']['tmp_name'][$i], $upload_directory . $_FILES['images']['name'][$i])) {
                $number_of_moved_files++;
				$fotos="INSERT INTO images(image, auto_id) VALUES('".$_FILES['images']['name'][$i]."', '$auto_id')";
				mysql_connect("...","...","..."); // mysql_connect("plaatsvandatabase","loginaanm","paswoord");
				mysql_select_db("geysensm"); // mysql_select_db("naamvandatabase");
				$result = mysql_query("$fotos");
				
			}

        }

    }
    echo "Number of File fields created $number_of_file_fields.<br/> ";
    echo "Number of files submitted $number_of_uploaded_files . <br/>";
    echo "Number of successfully moved files $number_of_moved_files . <br/>";
    echo "File Names are <br/>" . implode(',', $uploaded_files);

	print "$merk is succesvol toegevoegd!<br /><br />";


}
/**
 * This is example purpose only.
 */

?>
 
Laatst bewerkt:
Ik denk dat het niet zozeer een fout is, maar eerder een probleem

Ik denk dat jij 2 foto's voor het zelfde auto id heb toegevoegd, en doordat je de resultaten ophaalt met de volgende querie:
Code:
SELECT * FROM autos, images WHERE autos.auto_id = images.auto_id ORDER BY autos.auto_id DESC

haal je de resultaten van de Fait uit de tabel "autos", 2 keer op. Omdat de auto_id 2 keer voorkomt in de images table.

Nu kan je dit oplossen met de SQL functie GROUP BY. En denk ik dat je jou sql querie moet wijzigen in het volgende:
Code:
SELECT * FROM autos, images WHERE autos.auto_id = images.auto_id GROUP BY images.auto_id ORDER BY autos.auto_id DESC

groeten vreugde
 
Inderdaad, nu wordt de Fiat maar 1x getoond.

Heb je soms ook een idee hoe ik op de detail pagina van de auto dan wel alle foto's laat zien, die laat mij maar 1 foto zien :D

Nu heb ik:

PHP:
<?php
// START PHP CODES. THIS PART MUST ON THE TOP OF THIS PAGE. 

// Connect database. 
mysql_connect("...","...","..."); // mysql_connect("plaatsvandatabase","loginaanm","paswoord");
mysql_select_db("geysensm"); // mysql_select_db("naamvandatabase");

// *** Select data to show on text fields in form. ***

// Get id parameter (GET method) from select.php 
$auto_id=$_GET['auto_id'];

// Get records in all columns from table where column id equal in $id and put it in $result.
$result=mysql_query("SELECT * FROM autos, images WHERE images.auto_id = '$auto_id'");

// Split records in $result by table rows and put them in $row. 
$row=mysql_fetch_assoc($result);

// Close database connection. 
mysql_close();
?>
<!-- END OF PHP CODES AND START HTML TAGS -->
<html>
<body>
<h1><?php echo $row['merk']; ?> <?php echo $row['type']; ?></h1>
<center><img src="admin/uploaded/<? echo $row['image']; ?>" height="400"></center>
<center><table width="60%">
	<tr>
		<td width="50%" align="left"><b>Merk:</b></td>
		<td><?php echo $row['merk']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Model:</b></td>
		<td><?php echo $row['type']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Carroserietype:</b></td>
		<td><?php echo $row['carroserietype']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Bouwjaar:</b></td>
		<td><?php echo $row['bouwjaar']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Kilometerstand:</b></td>
		<td><?php echo $row['km']; ?> km</td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Vermogen:</b></td>
		<td><?php echo $row['vermogen']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Brandstof:</b></td>
		<td><?php echo $row['brandstof']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Verbruik:</b></td>
		<td><?php echo $row['verbruik']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Kleur:</b></td>
		<td><?php echo $row['kleur']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Transmissie:</b></td>
		<td><?php echo $row['transmissie']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Versnellingen:</b></td>
		<td><?php echo $row['versnellingen']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Cilinderinhoud:</b></td>
		<td><?php echo $row['cilinderinhoud']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Aantal deuren:</b></td>
		<td><?php echo $row['deuren']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Opties:</b></td>
		<td><?php echo $row['opties']; ?></td>
	</tr>
	<tr>
		<td width="50%" align="left"><b>Prijs:</b></td>
		<td>&euro; <?php echo $row['prijs']; ?></td>
	</tr>
</table>
</center>
</body>
</html>
 
Laatst bewerkt:
Probeer dit eens, zal wel aangepast en nog getest moeten worden maar dat zal wel lukke denk ik


PHP:
<?php
// Sla de auto_id op in een variable zodat je het kan controleren en hergebruiken
$auto_id = $_GET["auto_id"];
$results = "";
$results_image = "";

if ($actie == "show")
{
	$results .= "<table width=\"750\">";
	
	// Eerst ervoor zorgen dat je de data ophaalt van de auto, voordat je de foto's ophaalt
	$query_data = mysql_query("SELECT * FROM autos WHERE auto_id='$auto_id'");
	// Omdat de auto-id uniek is, kan je deze maar 1 keer ophalen dus een if-statement zou voldoende moeten zijn
	if (($data = mysql_fetch_object($query_data)) == true)
	{
		$results .= "<tr> <td colspan='5' align='center' class='style6'><b>$data->merk $data->type</b></td> </tr>";
		
		$results_image .= "<table> <tr>";
		
		// Haal daarna de images op, om te kunnen tonen
		$query_images = mysql_query("SELECT * FROM images WHERE auto_id='$auto_id'");
		while (($images = mysql_fetch_object($query_images)) == true)
		{
			// Maak een aparte table, lijst of wat dan ook zodat je deze in een rij kan zetten en mensen kunnen kiezen welke foto ze willen zien
			$results_image .= "<td><img src='uploaded/$images->image' height='30' /></td>";
		}
		
		$results_image .= "</tr> </table>";
		
		$results .= "<tr>
						<td style='width: 20%' rowspan='2' align='center' class='style5'>
							<a href='uploaded/$data->image' target='_blank'><img src='uploaded/$data->image' height='100'></a>
						</td>
						<td style='width: 20%' align='center' class='style5'><b>&euro; $data->prijs<b></td>
						<td style='width: 20%' align='center' class='style5'><b>$data->km km<b></td>
						<td style='width: 20%' align='center' class='style5'><b>$data->bouwjaar<b></td>
						<td style='width: 20%' align='center' class='style5'><b>$data->vermogen PK<b></td>
					 </tr>
					 <tr>
						<td colspan='4' class='style5'><b>Brandstof:</b> $data->brandstof<br /><b>Kleur:</b> $data->kleur</td>
					 </tr>
					 <tr>
						<td colspan='4'>$results_image</td>
					 </tr>";
	}
	
	$results .= "</table>";
}

// Laat het geheel zien, met maar 1 echo aanroep
echo $results;
?>

groeten vreugde
 
Ok, zal dit meteen eens testen als Priorweb terug actief is. Ze hebben momenteel een netwerkstoring
 
Het is al terug online, kheb het gepubliceerd, mijn mysql connectie ingevoegd.
Maar ik krijg niets. Volgens mij heb je een verkeerde code gebruikt van mij, khad de verkeerde gepost, maar snel aangepast :D
 
Het werkt zo goed als volledig,

Enkel wordt de grote afbeelding niet getoond: http://www.cwint.be/?pg=detail&auto_id=78

PHP:
<html>
<head>
<style type="text/css">
.style5 {
	border: 1px solid #000000;
	font-size:13px;
}
.style6 {
	border: 1px solid #000000;
	background-color: #EAEAEA;
	font-size:13px;
}
</style>
</head>
<?php
mysql_connect("192.168.0.69","cwint","..."); // mysql_connect("plaatsvandatabase","loginaanm","paswoord");
mysql_select_db("geysensm"); // mysql_select_db("naamvandatabase");

// Sla de auto_id op in een variable zodat je het kan controleren en hergebruiken
$auto_id = $_GET["auto_id"];
$results = "";
$results_image = "";
 
    $results .= "<h1>$data->Merk $data->type</h1><table width=\"750\">";
    
    // Eerst ervoor zorgen dat je de data ophaalt van de auto, voordat je de foto's ophaalt
    $query_data = mysql_query("SELECT * FROM autos WHERE auto_id='$auto_id'");
    // Omdat de auto-id uniek is, kan je deze maar 1 keer ophalen dus een if-statement zou voldoende moeten zijn
    if (($data = mysql_fetch_object($query_data)) == true)
    {
        $results .= "<tr> <td colspan='5' align='center' class='style6'><b>$data->merk $data->type</b></td> </tr>";
        
        $results_image .= "<table> <tr>";
        
        // Haal daarna de images op, om te kunnen tonen
        $query_images = mysql_query("SELECT * FROM images WHERE auto_id='$auto_id'");
        while (($images = mysql_fetch_object($query_images)) == true)
        {
            // Maak een aparte table, lijst of wat dan ook zodat je deze in een rij kan zetten en mensen kunnen kiezen welke foto ze willen zien
            $results_image .= "<td><img src='admin/uploaded/$images->image' height='30' /></td>";
        }
        
        $results_image .= "</tr> </table>";
        
        $results .= "<tr>
                        <td style='width: 20%' rowspan='2' align='center' class='style5'>
                            <a href='admin/uploaded/$images->image' target='_blank'><img src='admin/uploaded/$images->image' height='100' /></a>
                        </td>
                        <td style='width: 20%' align='center' class='style5'><b>&euro; $data->prijs<b></td>
                        <td style='width: 20%' align='center' class='style5'><b>$data->km km<b></td>
                        <td style='width: 20%' align='center' class='style5'><b>$data->bouwjaar<b></td>
                        <td style='width: 20%' align='center' class='style5'><b>$data->vermogen PK<b></td>
                     </tr>
                     <tr>
                        <td colspan='4' class='style5'><b>Brandstof:</b> $data->brandstof<br /><b>Kleur:</b> $data->kleur</td>
                     </tr>
                     <tr>
                        <td colspan='4'>$results_image</td>
                     </tr>";
    }
    
    $results .= "</table>";
 
// Laat het geheel zien, met maar 1 echo aanroep
echo $results;
?>
 
Laatst bewerkt:
Dat klopt inderdaad, want de variable "images" gebruik jij buiten de While-loop terwijl deze alleen maar in de While-loop bestaat.

Je zal dus bijvoorbeeld de eerste image moeten bewaren in de While-loop zodat deze gebruikt kan worden buiten de While-loop

Dit kan je doen met een variabele die buiten de While-loop is gedeclareerd. Bijvoorbeeld:

PHP:
<?php
...
$first_image = "";
$got_first_image = false;
...
while (($images = mysql_fetch_object($query_images)) == true)
{
    ...
    // Bewaar de huidig geselecteerde image
    if ($got_first_image == false)
    {
        $got_first_image = true;
        $first_image = $images->image;
    }
}
...
$results .= "<tr>
                    <td style='width: 20%' rowspan='2' align='center' class='style5'>
                        <a href='admin/uploaded/$first_image' target='_blank'><img src='admin/uploaded/$first_image' height='100' /></a>
                    </td>"
...
?>
 
Ok bedankt :D

Nu kan ik verder met de rest van de website :D
 
Is goed,
graag gedaan en sterkte ermee

groete vreugde

Misschien toch nog een klein vraagje :D

Hoe laat ik auto's weergeven die geen bijhorende afbeeldingen hebben?
De auto komt wel in de database maar die wordt niet weergegeven, desnoods met een standaardwaarde geen_afbeelding.jpg
 
Ondertussen na veel proberen toch gevonden :D


PHP:
	        if (!empty($_FILES)) {
				$fotosl="INSERT INTO images(image, auto_id) VALUES('geen_afbeelding.jpg', '$auto_id')";
				mysql_connect("192.168.0.69","cwint","..."); // mysql_connect("plaatsvandatabase","loginaanm","paswoord");
				mysql_select_db("geysensm"); // mysql_select_db("naamvandatabase");
				$result = mysql_query("$fotosl");
			}else{
			if ($_FILES['images']['name'][$i] != '') { //check if file field empty or not
            $number_of_uploaded_files++;
            $uploaded_files[] = $_FILES['images']['name'][$i];
				if (move_uploaded_file($_FILES['images']['tmp_name'][$i], $upload_directory . $_FILES['images']['name'][$i])) {
                $number_of_moved_files++;
				$fotos="INSERT INTO images(image, auto_id) VALUES('".$_FILES['images']['name'][$i]."', '$auto_id')";
				mysql_connect("192.168.0.69","cwint","..."); // mysql_connect("plaatsvandatabase","loginaanm","paswoord");
				mysql_select_db("geysensm"); // mysql_select_db("naamvandatabase");
				$result = mysql_query("$fotos");
			}
			}
 
Er zit trouwens een SQL-injectie kwetsbaarheid in je site:
PHP:
$auto_id = $_GET["auto_id"];
<knip>
$query_data = mysql_query("SELECT * FROM autos WHERE auto_id='$auto_id'");

Als $auto_id een getal is kan je dit oplossen door het te casten naar een integer
PHP:
$auto_id = (int) $_GET["auto_id"];
of gebruik te maken van intval
PHP:
$auto_id = intval($_GET["auto_id"]);

In je INSERT-query zit mogelijk eenzelfde kwetsbaarheid, afhankelijk van waar $auto_id in die query vandaan komt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan