WinFuture-Forum.de: Php/mysql Where Id=$variable - Problem - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Php/mysql Where Id=$variable - Problem


#1 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 18. Oktober 2006 - 15:38

Hallo alle zusammen! ;(

Ich habe ein Problem:

Ich habe auf einer Seite eine MySQL Tabelle aufgelistet, wo man die Daten herauslesen kann! Unten auf der Seite gibt es ein Feld, wo man die ID eingeben kann, welche bearbeitet werden soll. Diese Variable heißt "$aendern".

Auf der nächsten Seite gelangt man auf ein Formular wo die Tabelleninhalt verändern kann. Nachdem den Inhalt eingegeben hat wir er mit...:

$query="UPDATE `allgemein` SET `rechnername` = '$Rechnername' WHERE `id` ='$aendern' LIMIT 1;";


...übergeben! In Betracht kommt nur der Part "WHERE `id` ='$aendern'"

Wie schon gesagt ist meine Variable $aendern. Geb ich nun auf der ersten Seite meine ID (z.B.) 3 ein, die ich verändern will, so übergibt er sie (die 3) auch auf jeden Fall auf die zweite Seite! Das habe ich mit einem einfachen "echo '$aendern'" getestet! Wenn ich nun mein geändertes wegschicke, so leert er mir das Tabellenfeld! Eigentlich sollte er das Feld nun ändern!!!

Sooooo! Wenn ich nun allerdings anstatt "WHERE `id` ='$aendern'" "WHERE `id` ='3'" eingebe, praktisch so:

$query="UPDATE `allgemein` SET `rechnername` = '$Rechnername' WHERE `id` ='3' LIMIT 1;";


...funktioniert alles so wie ich es will! Ich geb praktisch auf der zweiten Seite mein Rechnername ein, und er verändert es in Zeile 3, so wie ich es will...allerdings will ich es als variable machen.

Ich hoffe, ich habe mein Problem klar genug rübergebracht und ihr könnt mir helfen!

Danke schonmal im vorraus!

Grüßle

BoZ
0

Anzeige



#2 Mitglied ist offline   Andi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 248
  • Beigetreten: 20. Oktober 02
  • Reputation: 10
  • Geschlecht:Männlich
  • Wohnort:Hannover

geschrieben 18. Oktober 2006 - 15:47

Versuchs mal mit

$query="UPDATE `allgemein` SET `rechnername` = '$Rechnername' WHERE `id` ='".$aendern."' LIMIT 1;";

Kann PHP/MySQL zwar nicht sehr gut, aber wenn ich nicht voll danebenliege müsste das klappen ;(
AMD Phenom II X6 1055T | Scythe Mugen 2 | Gigabyte GA-890GPA-UD3H | 4 GB G.Skill DDR3-12800 CL7 | OCZ Vertex 2 E 60 GB | WD CaviarBlack 1 TB | PowerColor HD5850 PCS+ | Xigmatek Midgard | Seasonic M12II 520 Watt
0

#3 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 18. Oktober 2006 - 15:59

Hallo!

Vielen Dank für deine Antwort! Es passiert der gleiche Fehler wie wenn ich es nicht so habe! Sprich: Wenn ich dann auf "Eintragen" klicke, und es an die Datenbank sende, löscht er das Feld leer! Wenn ich allerdings anstatt '".$aendern."' einfach '3' mache, dann ändert er in der Reihe, wo die ID 3 ist, das was ich will!

Danke nochmals!

;(

BITTE HELFT MIR ;)
0

#4 Mitglied ist offline   Andi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 248
  • Beigetreten: 20. Oktober 02
  • Reputation: 10
  • Geschlecht:Männlich
  • Wohnort:Hannover

geschrieben 18. Oktober 2006 - 16:35

Hab deinen Post nochmal gelesen und nochmal zum Verständnis.

Du gibts auf einer Seite die ID an und schickst die dann über ein Formular auf die nächste, oder wie?
Wenn ja, dann heißt die Variable entweder $_POST['aendern'] oder $_GET['aendern'] (je nachdem was du da angegeben hast).
Am besten wär es, du postet den Quelltext von beiden Seiten.

Edit:
Könntest dich auch per ICQ melden, siehe Profil.

Dieser Beitrag wurde von Andi bearbeitet: 18. Oktober 2006 - 16:38

AMD Phenom II X6 1055T | Scythe Mugen 2 | Gigabyte GA-890GPA-UD3H | 4 GB G.Skill DDR3-12800 CL7 | OCZ Vertex 2 E 60 GB | WD CaviarBlack 1 TB | PowerColor HD5850 PCS+ | Xigmatek Midgard | Seasonic M12II 520 Watt
0

#5 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 19. Oktober 2006 - 09:30

Ok! Ich poste hier einmal die beiden Scripts:

show.php

<?php
require("mysqlconnection.inc.php");

$sql = "SELECT * FROM allgemein";
$allgemein_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");

?>

<table cellpadding="1" cellspacing="3" border="1">

<tr>

<td>ID</td>

<td>Rechnername</td>

<td>Hersteller</td>

<td>Modelnummer</td>

<td>Seriennummer</td>

<td>Kaufdatum</td>

<td>Patchstand Datum</td>

<td>Standort</td>

</tr>

<?php

while ($adr = mysql_fetch_array($allgemein_query)){

?>

<tr>

<td><?=$adr['id']?></td>

<td><?=$adr['rechnername']?></td>

<td><?=$adr['hersteller']?></td>

<td><?=$adr['modelnummer']?></td>

<td><?=$adr['seriennummer']?></td>

<td><?=$adr['kaufdatum']?></td>

<td><?=$adr['patchstand_satum']?></td>

<td><?=$adr['standort']?></td>

</tr>

<?php
}

?>

</table>
<br />
<form enctype='multipart/form-data' action='aendern.php' method='post'>

<b>ID:</b>
<input type='text' name='aendern' size='2'>
<input type='submit' value='bearbeiten'>
</form>



aendern.php

<html>
<head>
<title>Computerverzeichnis - Eingabe</title>
</head>
<body>
<font face='arial' size=2>
<br>

<form enctype='multipart/form-data'>
<table width='50%' border=0 cellpadding="5">
<tr><td> Rechnername</td>
<td>
<input type=text name='Rechnername' size=50></td></tr>
<tr><td> Hersteller</td>
<td>
<input type=text name='Hersteller' size=50></td></tr>
<tr><td> Modelnummer</td>
<td>
<input type=text name='Modelnummer' size=50></td></tr>
<tr><td> Seriennummer</td>
<td>
<input type=text name='Seriennummer' size=50></td></tr>
<tr><td> Kaufdatum</td>
<td>
<input type=text name='Kaufdatum' size=50></td></tr>
<tr><td> Patchstand Datum</td>
<td>
<input type=text name='PatchstandDatum' size=50></td></tr>
<tr><td> Standort</td>
<td>
<input type=text name='Standort' size=50></td></tr>
</table>
<input type='submit' value='Ändern'> <input type=reset value='Alles leeren'></form>
</body>
</html>


<?php
require("mysqlconnection.inc.php");
include("global.inc.php");

$errors=0;
$error="The following errors occured while processing your form input.<ul>";
pt_register('POST','Rechnername');
pt_register('POST','Hersteller');
pt_register('POST','Modelnummer');
pt_register('POST','Seriennummer');
pt_register('POST','Kaufdatum');
pt_register('POST','PatchstandDatum');
pt_register('POST','Standort');
echo "$aendern";
$query="UPDATE `allgemein` SET `rechnername` = '$Rechnername' WHERE `id` = '$aendern' LIMIT 1;";
mysql_query($query);
?>


<!-- This is the content of the Thank you page, be careful while changing it -->

<h2>Thank you!</h2>


<table width=50%>
<tr><td>Rechnername: </td><td> <?php echo $Rechnername; ?> </td></tr>
<tr><td>Hersteller: </td><td> <?php echo $Hersteller; ?> </td></tr>
<tr><td>Modelnummer: </td><td> <?php echo $Modelnummer; ?> </td></tr>
<tr><td>Seriennummer: </td><td> <?php echo $Seriennummer; ?> </td></tr>
<tr><td>Kaufdatum: </td><td> <?php echo $Kaufdatum; ?> </td></tr>
<tr><td>Patchstand Datum: </td><td> <?php echo $PatchstandDatum; ?> </td></tr>
<tr><td>Standort: </td><td> <?php echo $Standort; ?> </td></tr>
</table>
<!-- Do not change anything below this line -->
<br>
<a href="show.php">Show</a>


Wenn ich...

`id` = '$aendern'
in
`id` = $_POST['aendern']


...ändere, dann kommt eine Fehlermeldung.

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /aendern.php on line 52


Ändere ich
`id` = $_POST['aendern']
in
`id` = $_POST[aendern]
oder
`id` = '$_POST[aendern]'
, ist das Ergebniss gleich wie vorher! Er bringt keine Fehlermeldung, aber er leert einfach das Feld anstatt er es bearbeitet!

Bitte um Hilfe!

Grüßle

Boz

Dieser Beitrag wurde von Boz bearbeitet: 19. Oktober 2006 - 09:42

0

#6 Mitglied ist offline   kreischweide 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 19. Oktober 06
  • Reputation: 0

geschrieben 19. Oktober 2006 - 10:49

$query='
	UPDATE
		allgemein
	SET
		rechnername = "'.mysql_escape_string($Rechnername).'"
	WHERE
		id = "'.mysql_escape_string($_POST['aendern']).'"
	LIMIT 1';


Sollte gehen... immer darauf achten das du die Variablen die du an MySQL übergibst, richtig escaped sind... sonst gehts rund mit SQL injections.
0

#7 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 19. Oktober 2006 - 10:59

Hi! Vielen Dank für deinen Vorschlag! Genau das gleiche Problem wie mit den anderen! Also er ändert nicht das, was in der "Zelle" steht, sondern leert sie!!! Ich habe genau diesen Code kopiert! in meinem echo gibt er mir auch die richtige Variable aus! Wenn ich anstatt
id = "'.mysql_escape_string($_POST['aendern']).'"

einfach
id = "2"

mache, dann ändert er mir, wie ich es möchte, in der Zeile 2 meinen Rechnernamen. Wenn doch in der Varibale auch über das echo 2 ausgegeben wird und ich das dann reinsetzte, ist das doch genau das gleiche...

Bitte um Hilfe! <_<

Danke schonmal im vorraus :rofl:
0

#8 Mitglied ist offline   kreischweide 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 19. Oktober 06
  • Reputation: 0

geschrieben 19. Oktober 2006 - 11:04

mach mal bitte ein

<?php

echo '<pre>';
print_r($_POST);
echo '</pre>';

?>

in die aendern.php an den anfang und poste mal was da kommt wenn du die seite abschickst.

Ach sehe gerade... $_POST['Rechnername'] statt $Rechnername, es sei denn du hast register_globals in der php.ini aktiviert, was absolut nicht zu empfehlen ist.
0

#9 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 19. Oktober 2006 - 11:13

Array
(
	[aendern] => 2
)


Gibt es nachher aus!
0

#10 Mitglied ist offline   kreischweide 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 19. Oktober 06
  • Reputation: 0

geschrieben 19. Oktober 2006 - 11:14

Das Problem ist simpel, woher PHP wissen welche Daten du übermittelst... irgendwo musst du im Formular das du abschickst auch ein <input type=hidden/text> oder so sein, das den rechnernamen mitschickt <_<
0

#11 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 19. Oktober 2006 - 11:18

Wie genau meinst du das? <_<

Ich hatte gedacht, dass ich nur die ID brauche, damit er weiß, wo er was verändern soll...Kannst du mir einen Lösungsvorschlag machen? :rofl: *freu*
0

#12 Mitglied ist offline   asko 

  • Gruppe: aktive Mitglieder
  • Beiträge: 144
  • Beigetreten: 17. November 02
  • Reputation: 0

geschrieben 19. Oktober 2006 - 11:26

Irgendwie ist das doch Chaos pur!
1) Offensichtlich werden in den Formen keine Dateien hochgeladen, wieso trägt das Formular dann ein enctype='multipart/form-data' ?
2) Gewöhn' Dir mal eine ordentliche Schreibweise an. Sachen wie text=blabla sind schlechter Stil. Die Zuweisung gehört in doppelte Anführungszeichen, also text="blabla"
3) mysql_escape_string() ist obsolete. Man soll -laut Manual- immer mysql_real_escape_string() benutzen
4) Vergleichswert im Query, wie z.B. in der WHERE-Klausel gehören in einfach Anführungszeichen.
5) Der Code von Deinen Scripts ist so chaotisch das ich gar keine Lust habe mich groß damit zu befassen - scheinbar geht Dir aber auf dem Weg vom Formular 1 bis Ende Formular 2 die ID verloren. Kein Wundern, weil ich gerade so auf den ersten Blick nicht sehe wo die überhaupt übergeben wird. Wie wäre es, wenn Du die ID im zweiten Formular (aendern.php) in einem versteckten Feld mitschickst? <input type="hidden" name="id" value="<?=$_POST['id'];?>">

[edit]
Hab' zu langsam geschrieben (weil essen zwischendurch) aber kreischweide hat es oben bereits angedeutet wo der Fehler liegt.

[edit 2]
id ist in deinem Fall aendern, also musst Du das noch anpassen

Dieser Beitrag wurde von asko bearbeitet: 19. Oktober 2006 - 11:29

0

#13 Mitglied ist offline   Boz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 01. Mai 04
  • Reputation: 0

geschrieben 19. Oktober 2006 - 11:46

Tut mir leid, dass ich so blöd bin!

Wo genau muss ich was übertragen?
0

#14 Mitglied ist offline   kreischweide 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 19. Oktober 06
  • Reputation: 0

geschrieben 19. Oktober 2006 - 12:10

Hier mal mein Vorschlag, der weit weg ist von perfekt, aber wenigstens etwas an der Logik und der Darstellung verbessern sollte:

<?php
require_once("mysqlconnection.inc.php");

// Load all data
$sql = "SELECT * FROM allgemein";
$rsAll = mysql_query($sql) or die("Anfrage nicht erfolgreich");

/**
 * Escapes a string for safe dispplay in html context
 *
 * @param string $sValue
 * @return escaped string
 */
function escape_html_display($sValue) {
	return htmlentities($sValue, ENT_QUOTES);
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Language" content="de" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>title</title>
</head>
<body>
<table cellpadding="1" cellspacing="3" border="1">
	<tr>
		<th>ID</th>
		<th>Rechnername</th>
		<th>Hersteller</th>
		<th>Modelnummer</th>
		<th>Seriennummer</th>
		<th>Kaufdatum</th>
		<th>Patchstand</th>
		<th>Standort</th>
		<th>Aktion</th>
	</tr>
	<?php
	// Draw data sets
	while($aData = mysql_fetch_assoc($rsAll)) {
		echo '<tr>';
		echo '<td>' . escape_html_display( $aData['rechnername'] )	  . '</td>';
		echo '<td>' . escape_html_display( $aData['hersteller'] )	   . '</td>';
		echo '<td>' . escape_html_display( $aData['modelnummer'] )	  . '</td>';
		echo '<td>' . escape_html_display( $aData['seriennummer'] )	 . '</td>';
		echo '<td>' . escape_html_display( $aData['kaufdatum'] )		. '</td>';
		echo '<td>' . escape_html_display( $aData['patchstand_datum'] ) . '</td>';
		echo '<td>' . escape_html_display( $aData['standort'] )		 . '</td>';
		echo '<td>' . '<a href="aendern.php?id=' . $aData['id'] .'">Edit</a>' . '</td>';
		echo '</tr>';
	}
	?>
</table>
</body>
</html>


aendern.php
<?php
require_once("mysqlconnection.inc.php");
require_once("global.inc.php");

// Check for submitted data
if( !isset( $_GET['id'] ) || !is_numeric( $_GET['id'] ) ) {
	// Valid ID is missing, redirect back to overview
	header('Location: index.php');
	exit;
}

// Load ID data
$sql = 'SELECT * FROM allgemein WHERE id = "'.mysql_real_escape_string($_GET['id']).'"';
$rsDetails = mysql_query($sql) or die("Anfrage nicht erfolgreich");

// Check if data was found
if( mysql_num_rows( $rsDetails ) != 1 ) {
	die('Datensatz nicht gefunden');
} else {
	$aDetails = mysql_fetch_assoc($rsDetails);
}

// Check if data was submitted and update it
if( isset( $_POST['save_form'] ) ) {
	$sql = '
		UPDATE
			allgemein
		SET
			rechnername = "'.mysql_real_escape_string($_POST['rechnername']).'",
			hersteller = "'.mysql_real_escape_string($_POST['hersteller']).'",
			modelnummer = "'.mysql_real_escape_string($_POST['modelnummer']).'",
		WHERE
			id = "'.mysql_real_escape_string($_POST['id']).'"';
	
	// TODO: Irgendwohin leiten, umleiten, ausgeben das die Änderungen erfolgt sind.
}

/**
 * Escapes a string for safe display in input form elements
 *
 * @param string $sValue
 * @return escaped string
 */
function escape_html_form($sValue) {
	return htmlspecialchars($sValue, ENT_QUOTES);
}

/**
 * Eases the creation of standarised form input elements
 *
 * @param string $sInputName
 * @param integer $iSize
 * @param string $sValue
 * @return string html
 */
function createFormElement($sInputName, $iSize, $sValue) {
	return '<input type="text" name="'.$sInputName.'" size="'.$iSize.'" value="'.escape_html_form($sValue).'">';
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Language" content="de" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>title</title>
</head>
<body>
<form action="aendern.php" method="post">
	<table width="50%" border="0" cellpadding="5">
		<tr>
			<td>Rechnername</td>
			<td><?php echo createFormElement('rechnername', 50, $aDetails['rechnername']); ?></td>
		</tr>
		<tr>
			<td>Hersteller</td>
			<td><?php echo createFormElement('hersteller', 50, $aDetails['hersteller']); ?></td>
		</tr>
		<tr>
			<td>Modelnummer</td>
			<td><?php echo createFormElement('modelnummer', 50, $aDetails['modelnummer']); ?></td>
		</tr>
		<tr>
			<td>...</td>
		</tr>
	</table>
	<input type="hidden" name="id" value="<?php echo $aDetails['id']; ?>">
	<input type="submit" name="save_form" value="Ändern">
</form>
</body>
</html>


Das sollte in etwa die Logik wiederspiegeln denke ich?

Dieser Beitrag wurde von kreischweide bearbeitet: 19. Oktober 2006 - 12:14

0

#15 Mitglied ist offline   HighFidelity 

  • Gruppe: aktive Mitglieder
  • Beiträge: 119
  • Beigetreten: 06. Juni 04
  • Reputation: 0

geschrieben 19. Oktober 2006 - 12:23

Hallo Boz,

dein script ist - na sagen wir mal ziehmlich unprofessionell geschrieben. Deine datenbank wird bei jeder id, die du bearbeiten willst grundsätzlich zwei mal geupdated.

Das erste mal, wenn du in deiner show.php auf den button "bearbeiten" klickst. Da wird die aendern.php aufgerufen und der wert $_POST["aendern"] ist noch gesetzt (was auch die ausgabe deines echo-befehls zeigt).
Der ebenfalls für deinen update-befehl benötigte wert $_POST["Rechnername"] steht zu diesem zeitpunkt aber noch nicht fest - den willst du ja erst in das formular eintragen.

Deine mysql-query wird nun aber trotzdem das erste mal ausgeführt (mit leerem $_POST["Rechnername"]) und sieht für mysql dann so aus:
$query="UPDATE `allgemein` SET `rechnername` = '' WHERE `id` = '{$_POST["aendern"]}' LIMIT 1";
Man fügt übrigens kein extra semikolon am ende des sql query-string an.

Dies löscht nun erstmal den inhalt der Zelle "rechnername" mit der id "$_POST["aendern"]".

Nun hast du in der zwichenzeit schon fröhlich den neuen rechnernamen in dein formular eingetragen und klickst sicher den button "Ändern". Da im htms-code des formulars in deiner aendern.php kein ziel angegeben ist, wohin dieses formular geschickt werden soll, wird es einfach nochmal an die selbe datei (aendern.php) gesendet.

Nun hat die Variable $_POST["Rechnername"] einen wert (deinen abgeschickten rechnernamen), aber niemand hat nun $_POST["aendern"] nochmal mitgeschickt - was nun also leer ist.

Jetzt wird ein zweites mal deine sql-query ausgeführt und liest sich jetzt so:
$query="UPDATE `allgemein` SET `rechnername` = '{$_POST["Rechnername"]}' WHERE `id` = '' LIMIT 1";


Sql sucht also nach einer zeile mit der id = '', die es aber nicht finden kann und bricht die query ab.
Damit hast du in der ersten query-ausführung den rechnernamen gelöscht und in der zweiten passiert einfach gar nix.

Hoffe ich konnte dir die funktionsweise deines momentanen scripts etwas verständlicher machen.

[edit]
kreischweides vorschlag machts besser und sollte so gehen :-)

Dieser Beitrag wurde von HighFidelity bearbeitet: 19. Oktober 2006 - 12:33

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0