Befehl SELECT WHERE findet nicht alles

hpvw hat gesagt.:
Du wirst in dem Feld NULL stehen haben. Schreibe explizit einen leeren String rein oder definiere das Feld als NOT NULL.
hmm... also die Spalte in der Datenbank ist als NOT NULL definiert.
Wie kann ich das verhindern? Ich bekomms nicht hin.........

hpvw hat gesagt.:
Ich würde Dir empfehlen, nicht mit so einem relativ umfangreichen und vermutlich lange bestehendem Projekt zu beginnen, wenn Du noch recht wenig Datenbankkenntnisse besitzt.
Hinterher ärgerst du Dich und bekommst mächtige Probleme, wenn Du die DB erweitern willst und dann erst mühsam in eine richtige Struktur portieren musst.
Ein realistischer Fall einer Erweiterung, weitere Informationen zu den Darstellern mitzuspeichern, wie es bei jeder Filmdatenbank (z.B. http://www.kino.de oder http://www.ofdb.de) üblich ist, wird bei Deiner Struktur zum echten Problem. Aber auch da finden sich bestimmt Wege das Quick'n'Dirrty zu machen.
Also ich finde, dass ich gerade an einem leichteren Beispiel lerne bzw lernen will. Denn das ganze ist nicht als offizielle, umfangreiche Filmdatenbank gedacht, sondern nur eine Übersicht über meine DVDsl. Daher wird es z.B. besondere Informationen über Darsteller nicht geben, da es mich einfach nicht interessiert und es auch nicht relevant ist, ob man den Film angucken will oder nicht.
Außerdem finde ich auch, dass man doch nur an einem Beispiel lernen kann, dass man auch gebrauchen kann, oder? Daher sehe ich das jetzt nicht als sooo schwer an. Auch wenn ich natürlich nocht nicht alles weiß, wie es geht. Aber dafür lernt man ja, oder? :)
Jedenfalls vielen vielen Dank für deine Erklärungen.
 
Zuletzt bearbeitet:
Versuch doch mal mit [phpf]mysql_fetch_assoc[/phpf] oder [phpf]mysql_fetch_array[/phpf] die Daten auszulesen und dann nicht über die Indexnummer, sondern über den tatsächlichen Feldnamen als Index zuzugreifen. Vielleicht ändert das ja was an dem undefined Problem.
Ich denke, Du musst die Daten auch neu eintragen. Ich glaube nicht, dass eine Änderung auf NOT NULL auf bestehende Datensätze wirkt. Nur als Hinweis, falls Du das nicht von Anfang an so hattest.
Ich hatte so einen "Fehler" bisher nur, wenn das Feld nicht als NOT NULL definiert ist, aber ich greife auch immer mit den Feldnamen auf das Zeilenarray zu, vielleicht macht das ja einen Unterschied.
Du kannst das Array ja auch mal zur Kontrolle mit [phpf]print_r[/phpf] ausgeben, um zu sehen, was da tatsächlich drinsteht.

Sicherlich ist es sinnvoll, an einem Beispiel zu üben, welches man gebrauchen kann.
Aber es ist nun mal so, dass man sich die Grundlagen aneignen sollte, bevor man mit dem Coden beginnt.
Zu einer DB-Anwendung gehören im Wesentlichen 2 Teile.
Der eine ist die Datenbank, welche mit SQL abgefragt wird.
Der zweite ist die Anwendung selbst, also das PHP-Skript.
An erster Stelle steht das Datenbankdesign. Dazu gehört unabdingbar auch die Normalisierung.
Dann folgt die Anwendung mit den Abfragen und der Oberfläche.
Das Datenbankdesign ist allerdings auch recht theortisch und das sollte man ohne die DB zu implementieren erst mal auf einem Blatt Papier üben.

Ich hatte selbst für mich auch schon ein paar Datenbanken Quick and Dirty gemacht, ohne Normalisierung, weil ich dachte, das wird schon reichen.
Ich habe mich jedesmal geärgert, wenn ich da noch mal ran wollte und irgendwas erweitern wollte, weil sie eben doch nicht endgültig auf Dauer meinen Ansprüchen in der ersten Fassung entspricht. Meistens endete das darin, dass ich die DB vollständig neu Coden musste. Vielleicht kann ich Dir das ja ersparen.

Wenn Du diese DB auch zum lernen machen willst, solltest Du bereit sein, sie etwas später zu nutzen, aber dafür wirklich was gelernt zu haben. Wenn Du an einer Stelle (zum Beispiel bei den Abfragen mit SQL) nicht weiterkommst, kannst Du ja auch hier nachfragen.

Gruß hpvw
 
hpvw hat gesagt.:
Versuch doch mal mit mysql_fetch_assoc() oder mysql_fetch_array() die Daten auszulesen und dann nicht über die Indexnummer, sondern über den tatsächlichen Feldnamen als Index zuzugreifen. Vielleicht ändert das ja was an dem undefined Problem.
Ich denke, Du musst die Daten auch neu eintragen. Ich glaube nicht, dass eine Änderung auf NOT NULL auf bestehende Datensätze wirkt. Nur als Hinweis, falls Du das nicht von Anfang an so hattest.
Ich hatte so einen "Fehler" bisher nur, wenn das Feld nicht als NOT NULL definiert ist, aber ich greife auch immer mit den Feldnamen auf das Zeilenarray zu, vielleicht macht das ja einen Unterschied.
Du kannst das Array ja auch mal zur Kontrolle mit print_r() ausgeben, um zu sehen, was da tatsächlich drinsteht.
Also ich lese die Sachen mit mysql_fetch_array() aus.

Die ganze Spalte hab ich schon mit NOT NULL erstellt. Also von Anfang an.

Print_r gibt nichts besondere aus. Kommen die selben Meldungen.
Hab das Skript jetzt mal in der Art auf meinen Webspace im Web geschoben und probiert (versuchen tu ich es local) und da kommt keine Meldung. Ist das somit eine Frage der PHP/Apache Einstellungen?
 
Zuletzt bearbeitet:
InFlame hat gesagt.:
Also ich lese die Sachen mit mysql_fetch_array() aus.

Also die ganze Spalte hab ich schon mit NOT NULL erstellt. Also von Anfang an.

Print_r gibt nichts besondere aus. Kommen die selben Meldungen.
Welche Indizes sind denn in dem Array vorhanden?
Poste doch mal die Ausgabe von print_r.
Du greifst ja nach der Fehlermeldung scheinbar nicht über $row['spaltenname'] sondern über $row[2] auf die Daten zu. Das ist riskant, wenn Du irgendwann Dein Query anpasst und die Darsteller nicht mehr an Position 2 bzw. Spaltenindex 2 stehen.
InFlame hat gesagt.:
Hab das Skript jetzt mal in der Art auf meinen Webspace im Web geschoben und probiert (versuchen tu ich es local) und da kommt keine Meldung. Ist das somit eine Frage der PHP/Apache Einstellungen?
Ja. Das ERROR_REPORTING ist auf den Webservern meist reduziert oder ausgeschaltet (PHP-Einstellung).
Auf Deinem lokalen Testsystem solltest Du aber auf jeden Fall die NOTICE's weiterhin anzeigen lassen.
Das hilft bei der Fehlersuche.
 
hpvw hat gesagt.:
Welche Indizes sind denn in dem Array vorhanden?
Poste doch mal die Ausgabe von print_r.
Du greifst ja nach der Fehlermeldung scheinbar nicht über $row['spaltenname'] sondern über $row[2] auf die Daten zu. Das ist riskant, wenn Du irgendwann Dein Query anpasst und die Darsteller nicht mehr an Position 2 bzw. Spaltenindex 2 stehen.
Also wenn ich dich jetzt richtig verstanden habe denkst du, dass ich die Spalten mit den Spaltenposition in der Tabelle auslese, oder? Dem ist nicht so. Aber hier mal mein ganzes Skript, das für das Auslesen verantwortlich ist:

PHP:
<?php
include("inc/db_dvd_lh.inc.php");
?>
<html>
<head>
<title>Detailseite zur DVD</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<h1 align="center">Detailseite zur DVD</h1>
<center><p><a href="auslesen.php4">Zurück zur Übersicht</a></p></center>
<?php
$dvdnr = $_GET['dvdnr'];
/* AUSLESEN */	
	$an_id=mysql_query("SELECT * FROM dvd WHERE dvdid=$dvdnr") or die("Auslesen nicht möglich: " . mysql_error());
	$zeile=Mysql_fetch_array($an_id);
	$title=($zeile["title"]);
	$orig=htmlspecialchars($zeile["orig_title"]);
	$land=htmlspecialchars($zeile["land"]);
	$jahr=$zeile["jahr"];
	$regie=$zeile["regie"];
	$darsteller=$zeile["darsteller"];
	$genre=$zeile["genre"];
	$inhalt=$zeile["inhalt"];
	$fsk=$zeile["fsk"];
	$nr=$zeile["dvdid"];
	$bild_url=$zeile["bild"];
	$count=$zeile["count"];
	?> 
<table width="75%" border="0" align="center">
  <tr> 
    <td width="17%"><b>Nr.:</b></td>
    <td width="25%"><?php echo $nr; ?></td>
    <td colspan="2"><b><img src="images/<?php echo $bild_url ?>" width="120" height="168"></b></td>
  </tr>
  <tr> 
    <td width="17%"><b>Filmtitel:</b></td>
    <td width="25%"><?php echo $title; ?></td>
    <td width="22%"><b>Original Titel:</b></td>
    <td width="32%"><?php echo $orig; ?></td>
  </tr>
  <tr> 
    <td width="17%"><b>Land:</b></td>
    <td width="25%"><?php echo $land; ?></td>
    <td width="22%"><b>Jahr:</b></td>
    <td width="32%"><?php echo $jahr; ?></td>
  </tr>
  <tr> 
    <td width="17%"><b>FSK:</b></td>
    <td width="25%"><?php echo $fsk; ?></td>
    <td width="22%"><b>Genre:</b></td>
    <td width="32%"><?php echo $genre; ?></td>
  </tr>
  <tr> 
    <td width="17%"><b>Regie:</b></td>
    <td width="25%"><?php echo $regie; ?></td>
    <td width="22%"><b>Darsteller:</b></td>
    <td width="32%">
	<?php 
	list ($darsteller1, $darsteller2, $darsteller3) = split(', ', $darsteller); 
	echo "<a href=\"auslesen.php4?darsteller=$darsteller1\">$darsteller1</a>,"; 
	echo "<a href=\"auslesen.php4?darsteller=$darsteller2\">$darsteller2</a>,";  
	echo "<a href=\"auslesen.php4?darsteller=$darsteller3\">$darsteller3</a>"; 
	 ?></td>
  </tr>
  <tr> 
    <td width="17%"><b>Inhalt:</b></td>
    <td colspan="3"><?php echo $inhalt; ?></td>
  </tr>
</table>
<?php
echo ("<center>Diese DVD <b>$title</b> wurde bisher $count mal aufgerufen</center>");
$countneu = ($count +1);
mysql_query("UPDATE dvd SET count=$countneu WHERE dvdid = $dvdnr") or die("Eintrag nicht möglich: " . mysql_error());
?>
<p>&nbsp;</p>Darsteller3:
<?php
  print_r ($darsteller3);
?>
</body>
</html>
<?php 
mysql_close();
?>
So, was findest du zu Bemängeln? ;)

hpvw hat gesagt.:
Ja. Das ERROR_REPORTING ist auf den Webservern meist reduziert oder ausgeschaltet (PHP-Einstellung).
Auf Deinem lokalen Testsystem solltest Du aber auf jeden Fall die NOTICE's weiterhin anzeigen lassen.
Das hilft bei der Fehlersuche.
Hatte auch nicht vor es auszumachen, da ich ja eben wissen will, wenn etwas nicht stimmt. Aber ist trotzdem gut zu wissen :)

Nochmal vielen vielen Dank für die Geduld die du mit mir aufbringst :)
 
Da ham wirs ja!
Dein Fehler kommt nicht beim auslesen, wie ich dachte, sondern bei Deinem list/split Konstrukt.
[phpf]split[/phpf] gibt Dir ein Array mit mindestens einem Element zurück, im Zweifel ein leerer String. Aber das Array enthält maximal n+1 Elemente, wobei n die Anzahl der gefundenen Splitter ist.
Dein [phpf]list[/phpf]-Konstrukt erwartet aber ein Array mit 4 Elementen, somit wird, wenn keine 4 Elemente (Darsteller) eingetragen wurden ein Fehler ausgegeben.
Man sollte in PHP, mit seinen höchstdynamischen Arrays, nicht so starr Programmieren, gerade, wenn zu erwarten ist, dass sich die Anzahl der Elemente unterscheidet.
Du könntest zum Beispiel statt diesem
PHP:
    <?php
    list ($darsteller1, $darsteller2, $darsteller3) = split(', ', $darsteller);
    echo "<a href=\"auslesen.php4?darsteller=$darsteller1\">$darsteller1</a>,";
    echo "<a href=\"auslesen.php4?darsteller=$darsteller2\">$darsteller2</a>,";  
    echo "<a href=\"auslesen.php4?darsteller=$darsteller3\">$darsteller3</a>";
     ?>
folgendes schreiben (auch wenn ich Dich ungern bei dieser Datenstruktur unterstütze ;-] ):
PHP:
    <?php
    $darsteller = explode(', ', $darsteller);
    $darstellerAusgabe=array();
    foreach($darsteller as $d) {
        $darstellerAusgabe[]="<a href=\"auslesen.php4?darsteller=$d\">$d</a>";
    }
    echo implode(", ",$darstellerAusgabe);
     ?>

Ich habe mal [phpf]explode[/phpf] und [phpf]implode[/phpf] genommen, weil ich immer damit arbeite und ein regulärer Ausdruck, wie bei split hier nicht Not tut.

Die große Gefahr, die Dir bei Deiner Datenbank auffallen sollte, ist, dass Du erwartest, dass der User (meist wohl Du selbst) immer genau darauf acht gibt, dass das Trennzeichen zwischen Darstellern aus Komma und Leerzeichen besteht.
Außerdem musst Du jedesmal die Namen eingeben. Im normalisierten Fall könntest Du eine Darstellerliste anbieten, in der man nur die handelnden Darsteller des Films markieren muss. Nur bei den neuen, also nicht jedesmal, müsste man sich unter Umständen mit einer speziellen Syntax herumschlagen, aber auch das ließe sich umgehen.
Fehler wären dann nahezu ausgeschlossen.

Gruß hpvw
 
hpvw hat gesagt.:
Man sollte in PHP, mit seinen höchstdynamischen Arrays, nicht so starr Programmieren, gerade, wenn zu erwarten ist, dass sich die Anzahl der Elemente unterscheidet.
Ich wusste schon, dass das nicht gut programmiert war. Hat mich auch selber geärgert, da ich mich somit auf eine bestimme Anzahl an Darstellern hätte reduzieren müssen, aber ich konnte es nicht anders machen. War ja eigentlich schon ein bisserl stolz drauf, dass das in meiner Version halbwegs funktioniert hatte. :)

Dein Code funktioniert wunderbar. Vielen Dank.
Glaub auch soweit alles zu verstehen, bis auf der Teil: $darstellerAusgabe[]
Warum die klammern am schluss?

hpvw hat gesagt.:
Die große Gefahr, die Dir bei Deiner Datenbank auffallen sollte, ist, dass Du erwartest, dass der User (meist wohl Du selbst) immer genau darauf acht gibt, dass das Trennzeichen zwischen Darstellern aus Komma und Leerzeichen besteht.
Auch das war mir bewusst. Hätte/werde mir auch noch überlegen, in was für einer Schreibweise ich es speichern soll.

hpvw hat gesagt.:
Außerdem musst Du jedesmal die Namen eingeben. Im normalisierten Fall könntest Du eine Darstellerliste anbieten, in der man nur die handelnden Darsteller des Films markieren muss. Nur bei den neuen, also nicht jedesmal, müsste man sich unter Umständen mit einer speziellen Syntax herumschlagen, aber auch das ließe sich umgehen.
Fehler wären dann nahezu ausgeschlossen.
Ja, seh ich ja ein, dass Fehler nicht so leicht auftreten. Aber im prinzip kopier ich ja die Angaben zu den Filmen auch nur aus Datenbanken im I-Net. Also ist meiner Meinung nach das STRG+C u. STRG+V doch schneller, als wenn ich jeden Darsteller in einem Menü erst auswählen müsste. Aber werde es mir durch den Kopf gehen lassen.

Vielen vielen vielen Dank für deine Hilfe. Hat mir wirklich sehr weitergeholfen und konnte auch einiges lernen... hoff ich jedenfalls :)
Und bitte versteh es nicht falsch, aber an einem Problem häng ich noch was mich, wenn auch nur gedanklich, daran hindert, weiter zu machen. Wenn du mir vielleicht da noch helfen könntest? Will nämlich irgendwie keiner, hab ich das Gefühl :(
Das Problem

Nochmal vielen vielen Dank
 
Das mit den Klammern ist das gleiche, wie [phpf]array_push[/phpf].
Bei Deinem Upload Problem kann ich Dir nicht helfen, da hab ich keine Ahnung von und muss selbst immer Stundenlang probieren, bis es geht.
Aber dazu gibt es massig Beispiele hier bei Tutorials und im Netz.

Gruß hpvw
 
Zurück