PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DropDown Probleme


Luke85
11.09.2007, 08:14:28
Hey Leutz!
Ich benötige einen Tipp von euch, wie ich das optimal verwirkliche. Habe ein Ausleseformular, dass die Datensätze aus der Datenbank in die Tabelle lädt.
Über die Auswahl eines DropDownmenüs sollen die einzelnen Produkte ausgewählt gewählt werden. Die Produktnummer, der Primarykey in der Datenbank, wird bereits ins DropDown geladen. Ab hier hänge ich fest: Wenn ich einen Datensatz auswähle wird dieser nicht reingeladen.
Wie heißt der Befehl, der mir das ermöglicht? Hier mal der Code, vllt. ist das nur eine kleine Geschichte.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Daten ausgeben</title>
<script type="text/javascript" src="format.js"></script>

</head>

<body>

<?php

// Verbindung wird zur Datenbank aufgenommen
$db = mysql_connect ("localhost","benutzer","");

// SQL-Anfrage an Datenbank "Produkt"
$res = mysql_db_query("produkt", "select DISTINCT * from test ORDER BY Produktnummer ASC");

// Liefert Anzahl betroffener Datensätze
$num = mysql_affected_rows();

for ($i=0; $i<$num; $i++)
{
$ty = mysql_result($res, $i, "Typ");
$tn = mysql_result($res, $i, "Teilung");
$fb = mysql_result($res, $i, "Frequenzbereich");
$ed = mysql_result($res, $i, "Einfuegungsdaempfung");
$rd = mysql_result($res, $i, "Rueckflussdaempfung");
$is = mysql_result($res, $i, "Isolation");
$im = mysql_result($res, $i, "Impedanz");
$wi = mysql_result($res, $i, "Widerstand");
$sz = mysql_result($res, $i, "Schalterzeit");
$st = mysql_result($res, $i, "Schalttyp");
}



?>

<form action="daten_ausgeben_beta2.php" method="get" name="focusform">
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td width="350">
<td width="200">
<strong>Produktnummer:
<select name="Produktnummer" onChange="produkt()">

<?php
for ($i=0; $i<$num; $i++)
{
$pn = mysql_result($res, $i, "Produktnummer");
echo "<option value= '$pn'>$pn</option>";
}
?>
</select></strong>
</td>
</td>
</tr>
<tr>
<td>Teilung</td>
<td><input id="pn" name="Teilung" size="80" value="<?php echo "$tn" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Frequenzbereich</td>
<td><input name="fb" size="80" value="<?php echo "$fb" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Einfügungsdämpfung</td>
<td><input name="ed" size="80" value="<?php echo "$ed" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Rückflußdämpfung</td>
<td><input name="rd" size="80" value="<?php echo "$rd" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Isolation</td>
<td><input name="is" size="80" value="<?php echo "$is" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Impedanz</td>
<td><input name="im" size="80" value="<?php echo "$im" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Widerstand</td>
<td><input name="wi" size="80" value="<?php echo "$wi" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Schalterzeit</td>
<td><input name="sz" size="80" value="<?php echo "$sz" ?>" readonly="readonly"></td>
</tr>
<tr>
<td>Schalttyp</td>
<td><input name="st" size="80" value="<?php echo "$st" ?>" readonly="readonly"></td>
</tr>
<tr>
<td></td>
<td><input type="reset"></td>
</tr>
</table>
</form>
</body>
</html>

Raketenmann
11.09.2007, 11:24:06
Es gibt keinen Befehl, der dir das ermöglicht. Du mußt das schon über Schleifen machen, nur in deiner Schleife werden die Variablenwerte immer wieder überschrieben, so wird das nix mit der Ausgabe.



// Verbindung wird zur Datenbank aufgenommen
$db=mysql_connect ("localhost","benutzer","");

// SQL-Anfrage an Datenbank "Produkt"
$res=mysql_query("SELECT * FROM test ORDER BY Produktnummer ASC");

$pr_nrn=array();

// Hier die Nrn. sammeln und falls etwas bestimmtes ausgewählt wurde, betreffenden Ds merken (show_produkt)
while($row=mysql_fetch_array($res))
{
$pr_nrn[]=$row['Produktnummer'];

if(isset($_GET['produkt']) && $_GET['produkt']==$row['Produktnummer'])
{
$zeige_produkt=$row;
}
}


// Ab hier Ausgabe

// Zuerst die Asuwahl der Produktnummern in einem <select>
echo '
<form name="produktwahl" method="get" action="'.$_SERVER['PHP_SELF'].'">
<select name="produkt" onchange="document.produktwahl.submit()">
<option value="-1">Bitte wählen</option><option value="-1"></option>';

for($z=0;$z<count($pr_nrn);$z++)
{
// Da die Produktnummer im value Attribut steht, kannst du als Bezeichnung der options natürlich auch was anderes als die Nummer verwenden...
if(isset($_GET['produkt']) && $_GET['produkt']==$pr_nrn[$z])
{
echo '<option value="'.$pr_nrn[$z].'" selected>'.$pr_nrn[$z].'</option>';
}
else
{
echo '<option value="'.$pr_nrn[$z].'">'.$pr_nrn[$z].'</option>';
}
}

echo '</select></form>';


// Wenn ein Produkt gewählt wurde, zeige es in einer Tabelle
if(isset($zeige_produkt))
{
$bezeichner=array('Produktnummer','Teilung','Frequenzbereich'); // usw.

echo '
<br>
<table>';

for($z=0;$z<count($bezeichner);$z++)
{
echo '
<tr>
<td>'.$bezeichner[$z].'</td>
<td>'.$zeige_produkt[$z].'</td>
</tr>';
}

echo '
</table>';
}



Du mußt dabei beachten, dass das Array $bezeichner in Anzahl und Reihenfolge der Elemente mit den Spalten deiner Tabelle übereinstimmen muß. So wie es jetzt ist, werden immer nur die ersten drei Merkmal ausgegeben.

Wenn du es noch verfeinern willst, kann du auch die Spaltennamen von MySQL beziehen und $bezeichner damit füllen.

Hatte sich dein JavaScript-Vorschau-Problem damit auch erledigt?

Luke85
11.09.2007, 11:44:49
Danke dir Raketenmann.
Ich habe mir schon gedacht, dass es nur über Schleifen geht. Dein Skript bleibt aber in Zeile "...while($row=mysql_fetch_array($res))..." stecken. Sehe jetzt nicht wieso, aber er macht nicht weiter.
Das mit der Vorschau hatte nicht so geklappt wie ich es mir vorgestellt habe. Deshalb möchte ich diese Ausgabe schreiben und dann nach erfolgreichem Einfügen, die Daten per Button ansehen. Umständlich aber naja.

Raketenmann
11.09.2007, 12:00:39
Jaja... wenn man es nicht ausprobiert ;-)

Also du kannst die while-Zeile mal ändern in

while($row=mysql_fetch_array($res,MYSQL_NUM))

Das ist aber nicht der Fehler, den du aktuell hast...


Schreibe mal unter die Zeile $res=... folgendes:

// SQL-Anfrage an Datenbank "Produkt"
$res=mysql_query("SELECT * FROM test ORDER BY Produktnummer ASC");

echo mysql_error();


EDIT
Ich hätte deine DB Verbindung nicht ändern sollen, also da wo das hier steht

// Verbindung wird zur Datenbank aufgenommen
$db = mysql_connect ("localhost","benutzer","");


muß das hier hin:

$db_server = "localhost"; // zum Bsp.
$db_name = ""; // mußt du füllen
$db_user = ""; // mußt du füllen
$db_passwort = ""; // mußt du füllen

MYSQL_CONNECT($db_server,$db_user,$db_passwort) or die ("Konnte keine Verbindung zur Datenbank herstellen");
mysql_select_db($db_name) or die("Auswahl der Datenbank fehlgeschlagen");

Luke85
11.09.2007, 12:06:30
Okay Fehler wurde ausgemerzt. Die Angabe des Datenbanknamens hat gefehlt. Danke dir ;)

Doch im DropDownMenü sehe ich nicht die Bezeichnung bzw. die Produktnummer ist nicht sichtbar, sprich es ist leer. Jedoch sind 4 Datensätze vorhanden, man kann diese auch auswählen.
Beim zweiten und letzten "unsichtbaren", wenn dieses angeklickt wird, erfolgt die Ausgabe. Aber nur dort.

Raketenmann
11.09.2007, 12:16:50
Mann... vielleicht sollte ich auch man hingucken, was ich mache...

Also das mit dem hier:
while($row=mysql_fetch_array($res,MYSQL_NUM))

war etwas unüberlegt, weil direkt danach ein assoziativer Index 'Produktnummer' verwendet wird...

Ich gehe davon aus, dass Produktnummer die erste Spalte in der DB Tabelle ist

while($row=mysql_fetch_array($res,MYSQL_NUM))
{
$pr_nrn[]=$row[0];

if(isset($_GET['produkt']) && $_GET['produkt']==$row[0])
{
$zeige_produkt=$row;
}
}


Das ist der schnellste Weg es zu ändern, ansonsten müsste unten noch die Ausgabe angepasst werden.

Luke85
11.09.2007, 12:35:07
Es geht, wow. Du bist mein Ausgabeheld ;D!
Dann werde ich jetzt eine Gescheite Ausgabetabelle schreiben, damit es gut formatiert aussieht und diese dann ins Echo setzten.

Dann kann man ja jetzt einen "Änder" Button einfügen, damit der ausgewählte Datensatz verändert werden kann oder?

Raketenmann
11.09.2007, 13:17:37
Klar...

Du schreibst einfach die Produktnr in ein Hidden-Input des Ändern-Formulars oder hängst die Nr an den Button. Dann weiß dein Update Skript "wo es lang geht". ;-)

Luke85
12.09.2007, 09:32:04
Kann das überhaupt so funktionieren, zwei unterschiedliche Anfragen an die MySQL-Datenbank in einer PHP-Datei?

Raketenmann
12.09.2007, 09:56:17
Kann das überhaupt so funktionieren, zwei unterschiedliche Anfragen an die MySQL-Datenbank in einer PHP-Datei?

Wenn man das richtig macht... Ja.


Ehrlich gesagt, verstehe ich nicht im geringsten was du da machst. Welche Ausgabe? Ich sehe nur den Versuch etwas in der DB-Tabelle "upzudaten". Aber woher kommen denn die Werte für $data? Fehlt da was? Kannst du mal den Rest zeigen und bitte ein paar Kommentare und Leerzeilen einfügen.

Schon mal soviel: Die Zählung des Feldindex bei mysql_field_name() beginnt bei 0. Wenn du $i mit 1 initialisierst, "vergißt" du das erste Feld. Das Gleiche gilt auch für das Array $data, das mit leeren eckigen Klammern, also per "Autoindex", erzeugt wird - das erste Element hat den Index 0.

Luke85
12.09.2007, 10:00:47
Ja ich merke auch, das kann so nicht sein.
Ich werde es jetzt nochmal Schritt für Schritt durchgehen und dementsprechend ändern.

Luke85
12.09.2007, 12:57:21
Also ich habs mal anders Probiert. Und zwar hier nach dem Schema:
http://oszhdl.be.schule.de/gymnasium/faecher/informatik/datenbanken/online/daten_aendern.html
Habe jetzt das Ausleseformular mit den DropDownMenü mit folgendem Skript vervollständigt:

echo '
<FORM action="produkt_aendern.php" METHOD="post">';

echo '<input type="submit" name="$pr_nrn" value="Datensatz ändern">';

echo '</FORM>';

Hier das Dokument produkt_aendern.php mit angepassten Werten,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Produkt ändern</title>
</head>

<body>
<?php
// Verbindung wird zur Datenbank aufgenommen
$db=mysql_connect ("localhost","benutzer","");

// Eingabe wird in Variable übergeben
$pr_nrn=$_POST['Produktnummer'];

//Prüfen ob der Datensatz in der Datenbank verfügbar ist
$query = "produkt, SELECT * FROM test WHERE Produktnummer = '$pr_nrn'";
$result = mysql_query($query);
$num = mysql_num_rows($result);

echo mysql_error();
mysql_close();
?>

<form action="produkt_aendern2.php" method="post">
<table width="665" border="1" cellspacing="0" cellpadding="0">
<tr>
<td width="162">Produktnummer</td>
<td width="497"><?php echo "$pr_nrn" ?><input type="hidden" name="Produktnummer" value="<? echo "$pr_nrn"; ?>"/></td>
</tr>
<tr>
<td>Typ</td>
<td><input type="text" name="Typ" value="<? echo mysql_result($result, 0, "Typ"); ?>"/></td>
</tr>
<tr>
<td>Teilung</td>
<td><input type="text" name="Teilung" value="<? echo mysql_result($result, 0, "Teilung"); ?>"/></td>
</tr>
<tr>
<td>Frequenzbereich</td>
<td><input type="text" name="Frequenzbereich" value="<? echo mysql_result($result, 0, "Frequenzbereich"); ?>"/> </tr>
<tr>
<td>Einfügungsdämpfung</td>
<td><input type="text" name="Einfügungsdämpfung" value="<? echo mysql_result($result, 0, "Einfügungsdämpfung"); ?>"/> </tr>
<tr>
<td>Rückflußdämpfung</td>
<td><input type="text" name="Rückflußdämpfung" value="<? echo mysql_result($result, 0, "Rückflußdämpfung"); ?>"/> </tr>
<tr>
<td>Isolation</td>
<td><input type="text" name="Isolation" value="<? echo mysql_result($result, 0, "Isolation"); ?>"/> </tr>
<tr>
<td>Impedanz</td>
<td><input type="text" name="Impedanz" value="<? echo mysql_result($result, 0, "Impedanz"); ?>"/> </tr>
<tr>
<td>Widerstand</td>
<td><input type="text" name="Widerstand" value="<? echo mysql_result($result, 0, "Widerstand"); ?>"/> </tr>
<tr>
<td>Schalterzeit</td>
<td><input type="text" name="Schalterzeit" value="<? echo mysql_result($result, 0, "Schalterzeit"); ?>"/> </tr>
<tr>
<td>Schalttyp</td>
<td><input type="text" name="Schalttyp" value="<? echo mysql_result($result, 0, "Schalttyp"); ?>"/> </tr>
<tr>
<td><input type="submit" name="Senden"></td>
<td><input type="reset"></td>
</tr>
</table>
</form>

</body>
</html>


Doch er hat Probleme beim Verbinden zur Datenbank, bei " $query = "produkt, SELECT * FROM test WHERE Produktnummer = '$pr_nrn'";".

Raketenmann
12.09.2007, 13:27:31
Vielleicht weißt du es besser als ich, aber gehört das "produkt," wirklich vor das "SELECT"? Kann man so eine DB auswählen, auf die sich das "SELECT" bezieht? So habe ich das noch nie gesehen (...kann aber, wie gesagt, auch meine Unwissenheit sein).

Ich hätte folgendes verwendet


// Verbindung wird zur Datenbank aufgenommen
mysql_connect ("localhost","benutzer","");

// DB auswählen
mysql_select_db('produkt');

mysql_query("SELECT * FROM test WHERE Produktnummer = '$pr_nrn'");



Und noch ein Tipp: Statt dir jedes Feld der Ergebnismenge einzeln über die lahmarschige Funktion mysql_result() zu ziehen, solltest du dir mal die Funktion mysql_fetch_array() und/oder ähnliche Funktionen im Handbuch ansehen.

Luke85
12.09.2007, 13:36:32
Ouh man, wieso bin ich nicht selbst draufgekommen. So ist die Fehlermeldung weg, jedoch habe ich jetzt ein Problem mit den Textfelder. In denen wird keine Datensatz übergeben sondern folgende Ausgabe steht drin. Dies im ersten:
"<br /><b>Warning</b>: mysql_result() [<a href='function.mysql-result'>function.mysql-result</a>]: Unable to jump to row 0 on MySQL result index 3 in <b>C:\Programme\xampp\htdocs\Formular\FERTIG - FUNKTIONIERT\produkt_aendern.php</b> on line <b>34</b><br />"

In den restlichen: "<br /><b>Warning</b>: mysql_result() [<a href='function.mysql-result'>function.mysql-result</a>]: Unable to jump to row 0 on MySQL result index 3 in <b>C:\Programme\xampp\htdocs\Formular\FERTIG - FUNKTIONIERT\produkt_aendern.php</b> on line <b>38</b><br />"

Luke85
13.09.2007, 08:33:11
So wie es scheint werden die Datensätze aus der Datenbank bzw. der Auswahl aus dem Formular mit dem Dropdownmenü nicht übergeben. Sehe ich das richtig, das die Variable bzw. der Name des Wertes, der in die einzelnen Felder geladen wird, exakt übereinstimmen muss mit dem Namen in der Datenbank ODER muss ich die einzelnen Felder vorher noch definieren?

Raketenmann
13.09.2007, 09:52:22
Wenn du meine Auswahlbox verwendest findest du die ausgewählte Nr nach dem Absenden in $_GET['produkt'], wenn du dein namenloses Formular verwendest, solltest du den Namen des Button ändern (aktuell heißt er $pr_nrn <- Das ist ein HTML Submit-Button, keine PHP Variable). Nenne ihn doch einfach pr_nr, dann findest du den Wert nach dem Absenden in $_POST['pr_nr'].


Worauf du dich hier beziehst


// Eingabe wird in Variable übergeben
$pr_nrn=$_POST['Produktnummer'];


kann man in deinen Beispielen nicht sehen, aber es könnte schon sein, dass da gar keine Produktnummer ankommt, um die Suche in deiner DB zu ermöglichen.




Einen Zusammenhang zwischen den Feldnamen eines HTML-Formulars und den Spalten einer DB-Tabelle gibt es nicht, die können unterschiedliche Namen haben. Bei den MySQL-Statements kommt es darauf an, dass Feldbezeichner korrekt verwendet werden und die Werte mit den jeweiligen Datentypen der Spalten übereinstimmen.


Aber dafür (sehe ich gerade erst) geht das hier gar nicht!

<tr>
<td>Einfügungsdämpfung</td>
<td><input type="text" name="Einfügungsdämpfung" value="<? echo mysql_result($result, 0, "Einfügungsdämpfung"); ?>"/> </tr>
<tr>
<td>Rückflußdämpfung</td>
<td><input type="text" name="Rückflußdämpfung" value="<? echo mysql_result($result, 0, "Rückflußdämpfung"); ?>"/>
</tr>

Keine Umlaute in name-Attributen verwenden!!!
...und auch kein ß!!!

Luke85
13.09.2007, 10:33:43
Das mit den Umlauten, habe ich versehentlich reingemacht, da war das Hirn schon aus.
Habs aber gleich geändert ;).

Ich verwende deine Auswahlbox und kann den Code nachvollziehen.
Mir stellt sich aber die Frage: Es wird die Variable $bezeichner benutzt, damit die linke Spalte der Tabelle die Spaltennamen reinschreibt und $zeige_produkt" für die rechte Spalte zur Ausgabe der einzelnen Werte.
Wenn ich jetzt aber, die Inhalte einzeln in eine Tabelle mit Textfeldern ausgeben will, in der ich dann die Werte veränder und anschließend zurück an die Datenbank sende, benötige ich doch für jede einzelne Zeile sprich: "Teilung: blaba" eine zugewiesene Variable, damit er das auch einheitlich zuordnen kann.
Liege ich da mit meiner Denkweise jetzt total falsch oder wie muss ich das mit der Bearbeiten-Ausgabe-Prozedur verstehen?

Raketenmann
13.09.2007, 11:06:04
Die Variable $bezeichner bezieht sich das Array, in dem ich die Spaltennamen platziert habe, um die Tabelle über eine kleine Schleife auszugeben. Die Zeilen der Tabelle sehen ja im Grunde alle gleich aus und somit muß man ja nicht zig mal hintereinander das Gleiche hinschreiben...

Du kannst das Array $bezeichner, wenn du es denn verwenden möchtest, auch weiter oben bilden, da wo $zeige_produkt erzeugt wird. Mit einer Schleife die Feldnamen aus dem Suchergebnis ziehen und $bezeichner zuweisen.

Statt die Elemente von $zeige_produkt (die die jeweiligen Daten des ausgewählten Elements beinhalten) direkt in eine Zelle zu schreiben, kannst du sie natürlich auf in das value-Attribut eines Input Feldes schreiben, um sie z.B. ändern zu können.

Auf den (neuen) Wert dieses Input-Feldes beziehst du dich nach dem Absenden über den Namen des Feldes (ohne Umlaute ;-) ) im $POST-Array.

Da du nicht ohne jede Prüfung einfach das in deine DB schreiben solltest, was ein Benutzer eingegeben hat, ist es völlig egal, wie die Inputfelder heißen. Es wär nur gut für dich (zum Verständnis) wenn sie sinnvolle Namen haben oder du notierst das Ganze so, dass du es als Array erhälst.



// Wenn ein Produkt gewählt wurde, zeige es in einer Tabelle
if(isset($zeige_produkt))
{
$bezeichner=array('Produktnummer','Teilung','Frequenzbereich'); // usw.

echo '
<br>
<form name="edit_form" method="post" action="produkt_aendern.php">
<table>
<input type="hidden" name="werte[]" value="'.$_GET['produkt'].'">';

for($z=0;$z<count($bezeichner);$z++)
{
echo '
<tr>
<td>'.$bezeichner[$z].'</td>
<td><input type="text" name="werte[]" value="'.$zeige_produkt[$z].'"></td>
</tr>';
}

echo '
<input type="submit" value=" Änderungen speichern ">
</table>
</form>';
}


Nach dem Absenden befindet in der Variable $_POST['werte'] ein Array mit den (geänderten) Werten aus den Eingabefeldern des Formulars - wobei sich in Element 0 die Produktnummer befindet. Kannst du dir ja mal mit
print_r($_POST['werte']);
ansehen, was das kommt und wie...

Die Werte aus den Elementen von $_POST['werte'] werden in die jeweilige Spalte deiner DB geschrieben.

Luke85
13.09.2007, 12:24:42
Krass, das hätte man einfach so rumschreiben sollen. Ich denke mir das immer alles viel kompliziert.
Habe den Printbefehl eingegeben. Ich sehe jetz auch die Struktur wie er das dann ausgibt. Jetzt muss ich doch nur mit dem SQL Updatebefehl ausführen, damit der Inhalt der Tabelle aktualisiert wird, oder?

Raketenmann
13.09.2007, 12:44:26
Richtig ;-)

Luke85
13.09.2007, 13:18:24
Habe mal folgendes geschrieben:

<?php
// Verbindungsdaten zur DB einbinden
include("db.inc");

$link=mysql_pconnect($dbserver, $dbuser, $dbpasswd);
if ($link == FALSE)
{
echo "<p><b>Leider kann keine Verbindung zur Datenbank hergestellt werden. Bitte
versuchen Sie es später noch einmal.\n";
echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
exit (); // PHP-Script beenden
}

// Datenbank auswaehlen
$dblink=mysql_select_db($dbname);
if ($dblink == FALSE)
{
echo "<p><b>Leider kann die Datenbank nicht geöffnet werden. Bitte
versuchen Sie es später noch einmal.\n";
echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
exit (); // PHP-Script beenden
}


$neuer_inhalt = $_POST['werte'];

$query = "Update test SET werte='$neuer_inhalt' WHERE 'Produktnummer'";

$reslut=mysql_query($query);
mysql_close;

print "<p>Das Produkt mit der Produktnummer <b>$neuer_inhalt</b> wurde geändert.<p>";
?>

Er gibt zwar die Message aus, aber in PHPmyAdmin ist keine Veränderung vorhanden.

Raketenmann
13.09.2007, 15:33:26
Deine Message hängt ja auch von nix ab, d.h. du könntest da auch hinschreiben, das die Klingonen morgen die Erde angreifen...
...ohne dass es dann auch passiert.


$query = "Update test SET werte='$neuer_inhalt' WHERE 'Produktnummer'";

Dies funktioniert so nicht, da hast du was falsch verstanden.

Es muß heißen:
"UPDATE SET spaltenname1='{$neuer_inhalt[1]}', spaltenname2='{$neuer_inhalt[2]}' ... WHERE Produktnummer='$neuer_inhalt[0]'"

Für "Spaltenname" trägst du die richtigen Namen der Spalten ein und vervollständigst das Statement da wo die Punkte sind um die restlichen Spalten.

Luke85
13.09.2007, 15:45:29
Habs jetzt so umgesetzt, wie du meintest, doch eine Veränderung ist immer noch nicht sichtbar in phpmyadmin.


$neuer_inhalt = $_POST['werte'];

$query = "UPDATE SET Typ='{$neuer_inhalt[2]}',
Teilung='{$neuer_inhalt[3]}',,
Frequenzbereich='{$neuer_inhalt[4]}',
Einfuegungsdaempfung='{$neuer_inhalt[5]}',
Rueckflussdaempfung='{$neuer_inhalt[6]}',
Isolation='{$neuer_inhalt[7]}',
Impedanz='{$neuer_inhalt[8]}',
Widerstand='{$neuer_inhalt[9]}',
Schalterzeit='{$neuer_inhalt[10]}',
Schalttyp='{$neuer_inhalt[11]}',
WHERE Produktnummer='$neuer_inhalt[1]'";

$reslut=mysql_query($query);
mysql_close;

print "<p>Das Produkt mit der Produktnummer <b>$neuer_inhalt</b> wurde geändert.<p>";
?>


Ich habe ja einen Printbefehl noch unten angegeben, damit die Veränderung angezeigt wird. Tut sie aber nicht, da dort ausgegeben wird im Browser "Das Produkt mit der Produktnummer Array wurde geändert." Die Werte jedoch werden nicht angezeigt.

Raketenmann
13.09.2007, 22:24:24
Ich meine es wäre die Rede davon gewesen, dass sich die Produktnummer in Element Nr. 0 und nicht in Element Nr. 1 befindet...



Die print Zeile macht was sie soll. $neuer_inhalt ist ein Array, also steht da Array. Da mußt du dich schon auf ein Element beziehen.

Luke85
14.09.2007, 08:22:35
Moin!
Also habe mal den Index korrigiert und mit der Ausgabe gespielt, doch es passiert nichts in phpmyadmin. Die Werte werden nicht verändert in der Tabelle und es kann nur Produktnummer aus dem Array gelesen werden. Dies habe ich festgestellt als ich die einzelnen Zeilen auslesen wollte mit $neuer_inhalt[x] (x=1,2,3,4,...).
Was ist da los? Wie bekomm ich das hin? Da fehlt doch noch der INSERT INTO Befehl oder irre ich mich? Das Skript wollte ich diese Woche endlich mal abschließen.

Raketenmann
14.09.2007, 09:33:44
Dies habe ich festgestellt als ich die einzelnen Zeilen auslesen wollte mit $neuer_inhalt[x] (x=1,2,3,4,...).

Wie hast du es ausgegeben? Sind die anderen Elemente leer?

Hast du schon genau geprüft, ob du alles richtig zusammengesetzt hast und nicht irgendwo Variablen verwendet werden, die es nicht gibt, ob die $_GET und $_POST Bezüge korrekt sind usw.?

Hast du mal mysql_error() nach dem UPDATE ausgegeben - Fehlermeldung? Sonst irgendwelche Fehlermeldungen? Prüfe mit print_r() an verschiedenden Stellen, ob der Inhalt des Array vorhanden ist, z.B. vor dem Absenden, um zu wissen, ob da nie Inhalte im Array waren oder ob irgendwelche Zuordnungen fehlen/falsch sind.

Da fehlt doch noch der INSERT INTO Befehl oder irre ich mich?

INSERT und UPDATE sind verschiedene paar Schuhe. Mit INSERT werden neue Zeile in die Tabelle geschrieben und mit UPDATE verändert man vorhandene.


Das Skript wollte ich diese Woche endlich mal abschließen.

Es steht dir jederzeit frei, zusätzlich einen Blick in die Handbücher zu werfen, um dir einen Teil deiner Fragen selber beantworten zu können

Luke85
14.09.2007, 09:51:59
Die Variablen stimmen überein und werden auch mit dem Print-Befehl ausgegeben.
Es gibt ja mehrere Ausgabemöglichkeiten Arrays auszugeben. So habe ich zum Bsp. versucht die Inhalte vom Array einzeln auszugeben:
- $bezeichner = array("pn"=>Produktnummer, ...) und anschließend die ausgabe mit echo $bezeichner[0] für Produktnummer.
Das seltsame an dem ganzen war, das immer nur die Produktnummer ausgegeben wird und die anderen Zeilen nicht, obwohl laut print-befehl der Index richtig wäre.
Habe jetzt noch paar Makken rausgemerzt aus produkt_aender2.php


// Datenbank auswaehlen
$dblink=mysql_select_db("produkt");
if (!$dblink)
{
echo "<p><b>Leider kann die Datenbank nicht geöffnet werden. Bitte
versuchen Sie es später noch einmal.\n";
echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
exit (); // PHP-Script beenden
}

$neuer_inhalt = $_POST['werte'];

$query = "UPDATE test SET Typ='{$neuer_inhalt[1]}',
Teilung='{$neuer_inhalt[2]}',
Frequenzbereich='{$neuer_inhalt[3]}',
Einfuegungsdaempfung='{$neuer_inhalt[4]}',
Rueckflussdaempfung='{$neuer_inhalt[5]}',
Isolation='{$neuer_inhalt[6]}',
Impedanz='{$neuer_inhalt[7]}',
Widerstand='{$neuer_inhalt[8]}',
Schalterzeit='{$neuer_inhalt[9]}',
Schalttyp='{$neuer_inhalt[10]}',
WHERE Produktnummer='{$neuer_inhalt[0]}'";

$reslut=mysql_query($query);
mysql_close($link);

Jedoch kein Resultat.

Was ich mit INSERT INTO meinte war, dass man diesen Befehl doch in die erste Datei, sprich daten_ausgeben_ddm.php reinmüsste. Da ich doch da neue Befehle eingebe. Der Befehl UPDATE folgt dann in produkt_aender2.php damit die Inhalte aktualisiert wird. ist doch richtig oder nicht?

P.S.: Wenn man stundenlang an so einem Skript sitzt und zich verschiedene Varianten probiert hat und es langsam voran geht, will man ja endlich mal fertig werden ;). War jetzt kein Apelle an dich, dass du mir das Ding schreiben sollt, so war das nicht gemeint ;).

Raketenmann
14.09.2007, 10:17:55
- $bezeichner = array("pn"=>Produktnummer, ...)

Dies ist eine Wertzuweisung für ein assoziatives Array, ein solches mußt du über die assoziativen Schlüssel ansprechen oder eine foreach-Schleife verwenden


und anschließend die ausgabe mit echo $bezeichner[0] für Produktnummer.


Dies gibt immer nur das erste Element des numerischen Arrays $bezeichner aus. Wenn du $bezeichner, wie oben, letztendlich assoziativ gebildet hast, wundert es mich, dass $bezeichner[0] überhaupt etwas ausgibt, das nicht lautet: "Undefined Index".


Was ich mit INSERT INTO meinte war, dass man diesen Befehl doch in die erste Datei, sprich daten_ausgeben_ddm.php reinmüsste. Da ich doch da neue Befehle eingebe. Der Befehl UPDATE folgt dann in produkt_aender2.php damit die Inhalte aktualisiert wird. ist doch richtig oder nicht?


INSERT dient ausschließlich dem Einfügen von Zeilen in eine Tabelle einer Datenbank. Die Daten, die du in das Formular schreibst, sind doch schon in der DB. Du brauchst also ausschließlich SELECT für deine Ausgabe und UPDATE zum speichern der Änderungen.




Kommt denn nun eine Fehlermeldung, wenn du mysql_error() hinter folgender Zeile einsetzt.

$reslut=mysql_query($query);
echo mysql_error();

Heißt die Variable eigentlich absichtlich $reslut? ...aus Frust oder so? ;-)


Du benutzt meine Auswahl für die Produktnummern, richtig? Dann füge dies hinter der while-Schleife ein und schick mal das Ergebnis...

while($row=mysql_fetch_array($res))
{
$pr_nrn[]=$row['Produktnummer'];

if(isset($_GET['produkt']) && $_GET['produkt']==$row['Produktnummer'])
{
$zeige_produkt=$row;
}
}

// Dies hier einfügen
print_r($zeige_produkt);

Luke85
14.09.2007, 10:27:18
Wieder bisschen schlauer mit den Arrays.
LoL nee war Zufall mit der Slut. Die Errormessage bezieht sich jetzt aber plötzlich auf das hier:
"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 Produktnummer='1'' at line 11". Wieder aber sehr seltsam, da dieser Befehl in Zeile 45 ist. Meint er den Index [11]?

Hier die Print-Ausgabe:
Array ( [0] => 1 [1] => DEV_121 [2] => xxx [3] => xxx [4] => xxx [5] => xxx [6] => xxx [7] => x [8] => xxxx [9] => xxx [10] => x )

Er findet und liest die Werte aus, das klappt. Nur er schreibt diese nicht in die Tabelle rein =/.

Raketenmann
14.09.2007, 10:44:01
Tja - da ist MySQL etwas eigensinnig, immer wenn die Antwort des Servers mit "You have an error in your SQL syntax;" beginnt, wird nix weiter gemacht... ;-)



Schalttyp='{$neuer_inhalt[10]}',
WHERE Produktnummer='{$neuer_inhalt[0]}'";

Das Komma vor dem WHERE muß weg! Schalttyp ist das letzte Element des SETs, braucht also kein Komma am Ende.

Luke85
14.09.2007, 10:47:50
Das war das Problem.
Doch jetzt geht weiter mit dem mist: Er übernimmt die Produktnummer in das nächste Feld, sobald ich die anderen Felder verändert habe... also Tippe ich was in Teilung rein, wird in Typ die 1 zum Bsp. reingeschrieben, verändere ich den Frequenzbereich rutscht wieder alles um 1. Hat das was mit dem Zähler aus der ersten Datei zu tun?

Raketenmann
14.09.2007, 11:48:52
Nein der erste Gedanke war Blödsinn... Das hattes du geändert!

EDIT:

Ja hat was mit dem Zähler der ersten Datei zu tun, da wird es verschoben, da sich die Produktnummer ja auch in $zeige_produkt an der Stelle 0 befindet.

In der der Schleife, die die Inputs erzeugt, muß eine Änderung rein. Bei $zeige_produkt[]


for($z=0;$z<count($bezeichner);$z++)
{
echo '
<tr>
<td>'.$bezeichner[$z].'</td>
<td><input type="text" name="werte[]" value="'.$zeige_produkt[$z+1].'"></td>
</tr>';
}

Luke85
14.09.2007, 11:54:35
Ouuuh man, bin ich ein Trottel!!!
Raketenmann ich danke dir, der Glaube ist wieder hergestellt LoL.

Ich werde mich jetzt an eine Löschenabfrage machen, dann ist Formular komplett.