Mysql-Übergabe fehlerhaft?

Hi nordi,

es gibt da noch ein paar Problemchen mit der csv.

1. Eine Zeile der csv besteht aus 21 Zellen, in die DB trägst du aber nur 19 Werte ein. Daraus resultiert, dass Die letzten beiden Spalten aus der csv nicht in die DB eingetragen werden.

2. Die Spalte "E" der csv ist komplett leer. Ist das so gewollt?

3. Meine "INSERT"-Anweisung ist noch fehlerhaft. Ich korrigiere sie, wenn wir Prob. 1 und 2 gelöst haben.



Ich hab schonmal mit den 19 Datensätzen probiert. Damit funktioniert das Inserten in dei DB prima.



Also Kopf hoch, die Lösung ist nahe. ;-)


Gruß.
 
Zuletzt bearbeitet:
Hi, hab grad auch noch mal die CSV-Datei gecheckt - du hast Recht - es sind 2 Zellen zu viel bzw. in der MYSQL-Funktion 2 zu wenig. In den letzten 2 Zellen steht auch nichts drinnen.. deswegen ist das halb so wild! Ja Spalte E ist gewollt leer, da dort noch Werte eingetragen werden sollen.

Gehen wir mal davon aus, es sollte nun alles klappen mit der Abfrage und der Übergabe der Werte. Kann man die Spalten auch innerhalb der CSV-Datei verschieben, bzw. zwischen zweien eine neue Spalte einfügen, ohne dass die Mysql-Überhabe dann fehlerhaft wird? Kann man den Spalten evtl. Namen geben, und diese dann an die MySQL-Funktion übergeben? Dann wäre das ganze nicht so "statisch" in der CSV-Datei und man könnte auch mal Spalten vertauschen bzw. hin und her schieben, ohne in der MySQL-Funktion die Variablen zu tauschen. Momentan wird ja nur via " ".$datenfeld[0]." [...]" die Spalte 0 [...] erfasst. Ich hoffe du verstehst meine Frage :D Naja.. langsam ernährt sich das Eichhörnchen :)
 
Hi nordi,

Wenn du die Spalten in der csv verschiebst oder neue Spalten einfügst, dann musst du die INSERT auch verändern, denn die INSERT ist momentan fest an die csv "gebunden", d.h., momentan ist datenfeld[0]=id, datenfeld[1]=title, usw.



Hier aber nun der funktionierende Code

PHP:
<form action="<?php print $PHP_SELF ?>" method="post" enctype="multipart/form-data">  
<input type="file" name="dateiname">
<br />
<br /> 
<input name="send!" type="submit" id="send!" value="File Hochladen"> 
</form> 
<?php   

include("../../config/config.php");  

if(isset($dateiname)){   
if(!is_uploaded_file($dateiname)){   
echo "FEHLER";   
exit;   
}   
$uploadname="./excel/$dateiname_name";   
move_uploaded_file($dateiname, $uploadname);   
printf("<b>Upload erfolgreich!</b><br>Die Datei <b>%s</b> wurde online gestellt in den Ordner %s und <br>in die Artists-Database eingetragen<br>\n",   
$dateiname_name, $uploadname);   
}  

// Ab hier hab ich getestet
$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die("Verbindung zum Server nicht hergestellt!<br>");  
$selectDB = mysql_select_db($dbtable) or die("Konnte die Datenbank <b>db_test</b> nicht auswählen");  

$dateiname2="excel/cliplist.csv";  
$datei=fopen($dateiname2,"r"); 
while(($datenfeld= fgetcsv($datei, 100000, ";")) != FALSE) 
{ 
    mysql_query("INSERT INTO $artists (id, title, artist, duration, agent, category, code, filename, info, web, unity, bw, musicartist, musictitle, musiclabel, musicalbum, musicduration, generic, comment) VALUES('".$datenfeld[0]."','".$datenfeld[1]."','".$datenfeld[2]."','".$datenfeld[3]."','".$datenfeld[4]."','".$datenfeld[5]."','".$datenfeld[6]."','".$datenfeld[7]."','".$datenfeld[8]."','".$datenfeld[9]."','".$datenfeld[10]."','".$datenfeld[11]."','".$datenfeld[12]."','".$datenfeld[13]."','".$datenfeld[14]."','".$datenfeld[15]."','".$datenfeld[16]."','".$datenfeld[17]."','".$datenfeld[18]."')");

    echo mysql_error()."<br>";
} 

fclose($datei);  
mysql_close();


Ich habe ab der Zeile: "// Ab hier hab ich getestet" die Anwendung getestet und bei mir hat sie einwandfrei funktioniert.

Sollte es bei dir immer noch Probleme geben, wird vermutlich eine deiner Variablen nicht mit Werten gefüllt.

BTW: In PHP macht es sich immer gut, nach jedem MySQL-Statement mysql_error() ausgeben zu lassen. Das hilft ungemein. Ich habs oben schon mal eingebaut.


Gruß.
 
Ah super! Funktioniert alles bestens - vielen Dank! Darf ich erfahren, wo der Fehler lag?

Ich habe mal eine kleine "inhaltliche" Frage. Die Exceliste beinhaltet, wie du ja schon gesehen hast, Künstler und ein paar andere Werte, wie zum Beispiel "$title". Ich will nun eine Liste ausgeben lassen, wo alle Künstler ("$artist") aufgelistet werden. Ein paar Künstler sind aber mehrmals aufgelistet, weil sie auch öfter in der Excelliste vorkommen, aber mit verschiedenen Werten im "$title". Ein Künstler hat ja nicht nur ein Bild sondern manchmal auch mehrere gemalt. Habe ich nun "unklug" die Excel-Datei angelegt oder kann man doppelte Abfragen bzw. Ausgaben nur mit einer ersetzen lassen? Ich würde gerne, dass man dann auf den Künstlernamen klickt und dann eine Seite aufgemacht wird, in der dann die Werte, die dann auf den Künstlernamen bezogen sind, angezeigt werden, wie dann beispielsweise alle Bilder. Hatte das vor wie unten im Beispiel via "$id"-Übergabe zu lösen.


Code:
<?php
include("../../config/config.php");		
$db = mysql_connect ($dbhost,$dbuser,$dbpass);
mysql_select_db ($dbtable);
$sql="SELECT * FROM $artists WHERE web = '1' ORDER BY title";
$result = mysql_query($sql,$db);
while (list($id,$title,$artist,$duration,$agent,$category,$code,$filename,$info,$web,$unity,$bw,$musicartist,$musictitle,$musiclabel,$musicalbum,$musicduration,$generic,$comment) = mysql_fetch_row($result)) 
{
echo "<a href=\"maske.php?id=$id\" target=\"artists\"><b>$artist</b></a><br>";
}
?>
 
Zuletzt bearbeitet:
Der Fehler lag darin, dass die Anzahl der VALUES nicht mit der Anzahl der Spalten übereingestimmt hat. Es waren 19 Spalten, aber nur 16 VALUES.


Das andere Problem werd ich morgen lösen. ;-)


Gruß
 
Hi nordi,

wenn du die alle Künstler auflisten lässt dann so:

Code:
$query=mysql_query("SELECT $artists FROM $table GROUP BY $artist");
while($result=mysql_fetch_array($query))
{
    echo $result[0]."<br>";
}


Eine Liste aller Bilder eines Künstlers erhältst du so:

Code:
$artist_name=$_POST['artistenname'];
$query=mysql_query("SELECT title FROM $artists WHERE artist='".$artist_name."'");
while($result=mysql_fetch_array($query))
{
    echo $result[0]."<br>";
}

$_POST['artistenname'] ist der Übergabewert aus der Textbox (die in diesem Fall "artistenname" heisst), in die der Name des Künstlers eingetragen werden kann.


Willst du es über eine ID machen, brauchst du 2 Tabellen.

Tabelle1:
artist
artist_id (PK)
artistname
[weitere optionale Felder]
...

Tabelle2:
artist_title
artist_id (PK)
titlename (PK)
titellänge (PK)
[weitere optionale Felder]
...

So könntest du mit
Code:
$query=mysql_query("SELECT * FROM artist_title WHERE artist_id=ID des Künstlers");
alle Werke des Künstlers ausgeben lassen. Die drei PK in der Tabelle "artist_title" garantieren die Eineindeutigkeit eines Eintrages.


Variante 2 ist sicherlich die sauberere Möglichkeit einer Datenspeicherung, da sie dem Model einer relationalen Datenbank schon sehr viel näher kommt. (Stichwort: die 3 Normalformen einer DB).


Gruß.
 
Hi, danke für die schnelle Antwort! Ich habe doch gar keine Textbox, wo ich die Werte eingebe. Alle Werte stammen aus der Exceldatei, die wird vorher in die MySQL-Datenbank eingespeichert haben.

Du meinst also, dass man zwei Datenbanken braucht, um das Problem mit den "doppelten" Einträgen bzw. Darstellungen von den Künstlern zu lösen? Wäre natürlich "elegant", dass alles mit einer zu lösen? Zerbreche mir schon nen Weilchen den Kopf darüber, ob man evtl. die Exceldatei anders gestaltet...
 
Hi nordi,

du brauchst nicht 2 Datenbanken, sondern 2 Tabellen in einer Datenbank, um eine "saubere" Lösung zu haben. In deinem Fall geht es auch mit einer Tabelle, mit dem Nachteil, dass diese bei vielen Einträgen länger für Abfragen braucht und du eben bei jedem Eintrag den vollen Namen des Künstlers speicherst (--> mehr Speicherbedarf).
Wie gesagt, das ist nicht elegant, aber trotzdem funktioniert es.

Thema Textbox:
Wenn du dir eine Liste mit allen Bildern eines Künstlers auflisten lassen willst, dann musst du es der Datenbank "übermitteln", nach welchem Künstler sie suchen soll.
Ich dachte halt, dass du den Künstlername in eine Textbox eingibst, danach auf einen Button (z.B. "suchen") klickst und dir dann alle Einträge, die es zu dem Künstler gibt, anzeigen lässt.

Unabhängig davon, wie du die Variable "$artistenname" befüllst ist die MySQL-Abfrage immer die selbe:
Code:
mysql_query("SELECT * FROM $artists WHERE artist='".$artistenname."');

An der Excel brauchst du nicht rumbasteln, die ist eigentlich ok so.



Gruß.
 
Hi S_Drum,

ok.. verstehe! Um wieviel verlängert sich denn dann so eine Abfrage, wenn man das "nur" mit einer Abfrage bearbeiten würde? Mit dem momentanen Skript läuft es auf jeden Fall alles relativ schnell ab. Da ich dir auch langsam nicht auf den Keks gehen will mit meinen ganzen Frage, würde ich das ganze einfach auf eine Tabelle in der Datenbank beschränken, so lange das so gut geht wie jetzt! Wenn ich also so die Abfrage nehme, wie du sie mir letztens vorgeschlagen hast, habe ich aber immer noch das selbe Problem, dass verschiedene Künstler doppelt bzw. mehrfach in der Auflistung auftauchen, da Sie auch mehrfach in der Excelliste vorkommen.

Zur Textbox :) So eine Suchabfrage ist natürlich schon schick, aber ich glaube, das wäre zu viel des Guten ;) Ich würde einfach wie ich das in meinem Beispiel angegeben habe, die Liste mit den Künstern anzeigen lassen und automatisch mit einem Link versehen, der dann auf eine Maske zeigt, in der die Daten von dem jeweiligen Künstler angezeigt werden.

Liste der Künstler:

Code:
$query=mysql_query("SELECT $artists FROM $table GROUP BY $artist");
while($result=mysql_fetch_array($query))
{
// Liste Künstler aufgeben mit Link der jeweiligen ID des Künstlers..
    echo "<a href=\"maske.php?id=$id\" target=\"artists\"><b>$result[0]."</b></a><br>";
}

Maske:

Code:
mysql_connect("$dbhost","$dbuser","$dbpass");
mysql_select_db("$dbtable");
$result = mysql_query("SELECT * FROM $artists WHERE id = ".$_GET["id"]." AND web = '1'");
 echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\">";
while($row = mysql_fetch_array($result))
{
// Hier dann die jeweiligen Abfragen wie bsplw. $title, $filename etc..
 
Hi nordi, wenn du mir auf den Keks gehst, sag ich dir das schon. ;-)

Ich werd mal ein Script zusammenbasteln und es dir dann zusenden. Momentan ist die Zeit aber ein bissel knapp.


Gruß.
 
Zurück