mit php mal den ersten, mal den zweiten datenbankeintrag ändern
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktion
beispiel
bild
brauche
code
datenbank
datum
frage
grund
http
index
kapitel
nutzer
problem
set
spalte
tabelle
update
zeile
zugriff
-
hallo!
also, ich hab da ein problemchen
ich habe eine tabelle (zb so, da ist noch mehr zeugs und die einträge sind nicht in zwei folgenden spalten)
kapitel spalte_01 spalte_09 a 2345 0 alt 2345 ip
wo ich einen wert ändern möchte,
kapitel spalte_01 spalte_09 a 2345 0 neu 2345 ip
das mache ich wiefolgt ...
$vara = "UPDATE ".$varb." SET kapitel='$varbc' WHERE spalte_01='$vard'"; $varbe = mysql_query($vara);
nur leider habe ich in der spalte_01 zweimal den gleichen wert stehen, allerdings soll nur beim zweiten der wert im kapitel gändert werden. wenn ich jetzt LIMIT verwende (das hab ich gefunden), dann wird ja theoretisch (ich habe es nicht getestet) der wert geändert, der erhalten bleiben soll. nu hab ich gegoogelt und so aber nicht das gefunden was ich brauche.
ich weiß nicht, ob das jetzt erschwerend ist, aber zusätzlich ist es nicht immer der fall, daß es in der spalte_01 zwei mal den gleichern wert hat - genaugenommen ist das die ausnahme. also es muß in der regel der erste wert geändert werden, im ausnahmezustand der zweite. außerdem ist diese mögliche änderung keine einmalige geschichte (soll heißen die werte in der datenbank selbst sollten nicht herumgeschubst werden).
das würde ich nun so lösen, das ich mitzählen lasse, wie oft ein wert geändert wurde (also mit UPDATE) und wenn UPDATE größer gleich zwei ist, den ersten wert wieder zurückschreiben lassen (der hat eine fixe beschreibung)... naja, und das dürfte nicht der königsweg sein ... *hust* ich weiß auch nicht, wie man genau UPDATE verwendet ...
naja, ein ändern ab zeile soundso ginge zur not auch (wenn das geht), aber das wäre für mich die allerletzte variant (wenn nix gehen sollte)
ach so, äh, ich muß über die spalte_01 herangehen, das hängt mit der ausgangs-geschichte zusammen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Erweiter deine Abfrage
für den ersten
$vara = "UPDATE ".$varb." SET kapitel='$varbc' WHERE spalte_01='$vard' AND kapitel='a' " ; $varbe = mysql_query($vara);
für den zweiten
$vara = "UPDATE ".$varb." SET kapitel='$varbc' WHERE spalte_01='$vard' AND kapitel='alt' " ; $varbe = mysql_query($vara);
Ich empfehle dir das die erste Spalte ID heißt mit einem auto_increment und dem index-wert, dann wird es diesen Wert nur einmal geben.
dann kannste Sagen
$vara = "UPDATE ".$varb." SET kapitel='$varbc' WHERE ID='1' " ; $varbe = mysql_query($vara);
Grüsse
Color
-
hallo, danke!
naja, also ein auto_increment ist mit drinnen, aber auf den kann ich eh nicht zugreifen, weil der im grunde irgendwo abgefragt wird ich werde den wohl eher rausschmeißen.
naja, also das problem ist so circa, daß du eine sache verwendest auf die ich eigentlich keinen zugriff haben (will)* - "alt" habe ich nicht als variable angegeben, weil das keine variable ist - das ist ja der wert der geändert werden soll unabhängig davon, was da vorher stand.
und die zeile wo "a" steht soll generell nie geändert werden - nur das sie bei anderen anfragen eben auch fehlt, dh das da dann in spalte_01 eh ein anderer wert steht und somit das problem nicht vorhanden ist ...
also viel hat mir das nun nicht geholfen.
gibt es denn nicht sowas wie WHERE spalte_01='$vard'" AND kapitel != 'a' ? - irgendwas so was in der art?
edit
*ich will, wenn ich schon relativ viele abfragen verursache, die wenigstens so kurz wie möglich halten - dh alles an datenverkehr unterdrückt werden kann will ich auch unterdrücken; dann geht's ja auch fixer
Beitrag zuletzt geändert: 11.9.2009 7:28:18 von sonok -
Ntürlich gibt es das, villeicht schaust du in dem Fall einfach mal auf
.http://schattenbaum.net/php/anlegen.php
sonok schrieb:
auf die ich eigentlich keinen zugriff haben (will)* - "alt" habe ich nicht als variable angegeben, weil das keine variable ist - das ist ja der wert der geändert werden soll unabhängig davon, was da vorher stand.
Wie willst du es sonst lösen? Willst du alle Daten bist auf diese eine ausschließen?
Du musst doch wissen was in deiner Tabelle steht damit du es ändern kannst, wenn du kapitel XYZ ändern willst, dann sucht du nach kapitel='XYZ' und dann hast du es.
Du musst nach einem oder mehren Daten in der Reihe suchen die auch nur in dieser Reihe vorkommen. Nicht alles ausgrenzen was nicht drin vorkommen darf. -
Rein aus den Informationen die du hier angibst kann ich mich nur colors Meinung anschließen, dass du deine Spalte mit dem AutoIncrement Wert nutzen solltest.
Aber fragen wir doch mal anders herum. Was ist die Anforderung an die Anwendung bzw. die Tabelle? Die reinen CRUD Operation scheint gegeben zu sein, denn sonst würdest du nicht auf ein DBMS setzen. -
hm, naja, ich bastel ja so einen primitiven bilderupload, und optimistisch wie ich bin lege ich die datenbank gleich so an, daß ich im falle vieler nutzer problemlos zb alphabetisch splitten kann um so eine gewisse performance zu erhalten
naja, und die grundstufe davon ist, daß ich von beginn an mit zwei datenbanken arbeite - eine optimiert zur schnellen darstellung der bilder und eine optimiert zur schnellen bearbeitung der daten (bzw was ich mir unter optimiert vorstelle - das ist im grunde mein erstes datenbankprojekt ) - ich stelle mir vor, so später besser auf die jeweiligen anforderungen im programm reagieren zu können.
tja, also wie schon erwähnt habe ich statt der ip's eindeutige bildernamen, die sich nur einmal mit einem bild pro nutzer wiederholen. und diese wiederholung macht in diesem einen datenbank-arbeits-prozess ein problem, ansonsten läuft es sauber durch. naja, drum mag ich eigentlich nicht alles auf ip's umstellen, die für den gesamten restprogrammablauf nur überflüssiger ballast sind.
hm, hab jetzt auch mal bei schattenbaum geguckt, wie man nun den operator (?) != einbaut weiß ich trotzdem nicht (ich kenn die verwendung auch nur von flash).
hm, also im wortlaut kann ich gut formulieren, was ich brauche:
in der tabelle x trage in die spalte y den wert a ein, wenn der gesuchte eintrag in der spalte z nicht den wert b hat -
Hä? Wir schreiben doch gar nichts von IP (Ip-Adresse) sondern von ID.
Das mit der alphabetischen Unterscheidung will mir zwar noch nicht ganz in den Sinn, aber das steht erstmal außen vor.
Du hast also einen Bildupload und einen Benutzer. Ein Bild hat folglich einen Namen, dieser Name bleibt bestehen oder erhält einen neuen von dir generierten Namen?
@!=: where spalte != wert -
jaa, ich meinte id's und nicht ip's, tut mir leid.
also, fatfreddy hat mir die richtige zeile gegeben -
"UPDATE ".$varb." SET kapitel='$varbc' WHERE spalte_01='$vard'" && kapitel !='letztereintrag";
jetzt geht es so wie ich es haben wollte und nun kann das thema von mir aus geschlossen werden -
Naja, ändert allerdings nichts daran das du eine ID mit Index haben solltest. Rein für die Geschwindigkeit.
-
evil-devil schrieb:
Naja, ändert allerdings nichts daran das du eine ID mit Index haben solltest. Rein für die Geschwindigkeit.
aber warum? ich habe außer diesem einen fall praktisch die id's in den bildernnamen eindeutig abgelegt. eine id wäre doch nur das gleiche nocheinmal in einer anderen zahlenfolge.
und da ich in flash viele aktionen mit dem bildernamen steuere, ist es nur logisch, wenn ich diesen als dreh- und angelpunkt meiner aktionen verwende.
dieser name muß sowieso übertragen werden, wenn ich auf ein bild zugreifen möchte. und ich kann den namen dann auch gleich wieder in das uploaddatum zerlegen, damit zeiträume berechnen usw usf.
oder wo genau liegt der geschwindigkeitsvorteil? -
Ok, das ist ein Argument. Ich dachte halt deine Applikation übermittelt direkt die Bilddaten. Dann wäre ein Zugriff über IDs entsprechend elegant und ich "meine" das ein numerischer Index schneller ist als ein Index über einen Text. Falls du auf deine Namensspalte einen Index gesetzt hast.
-
Also, ich nehme jetzt mal an User "XYZ" speichert ein Bild mit dem Namen "BildXY", der Name "BildXY" wird dann in eine ID verwandelt die es nur einmal geben darf.
Das heißt sollte das Bild jetzt die Zahl 50430 bekommen prüfst du in der Datenbank:
$Bild_ID = 50430 // Mal als Beispiel $data = mysql_query("SELECT ID FROM tabellenname WHERE ID = "".$Bild_ID.""); if(mysql_num_rows($data)>0) echo "Bild_ID schon vorhanden!" else Bild gespeichert.
Wenn du das Ganze in eine while-Schleife steckst sollte es kein Problem sein das die ID nur einmal vorkommt. Am bessten bekommt die ID einen Timestamp.
Dann kannste ja zum bearbeiten abfragen
$User = "XYZ"; // Wieder als Beispiel $data = mysql_query("SELECT * FROM tabellenname WHERE User='".$User."' "); echo "<ul>"; while($Data=mysql_fetch_assoc($data)) { echo "<li> <a href="?bildID=".$Data[BildID]."">$Data[BildName]</a></li> } echo "</ul>";
Und zum Updaten dann nachdem es angeklickt wurde
mysql_query("UPDATE tabellenname SET BildID="was auch immer" WHERE BildID='".$_GET['bildID']."'");
Hier solltest du aber drauf achten das du die $_GET-Variable vorher überprüfst auf "gefährlichen" Code, json_encode oder mysql_real_escape_string oder htmlspecialchars ....
Wenn du etwas ausschließen willst, schreibst du es so:
mysql_query("SELECT * FROM tabelle WHERE x='1' AND (y!='2' OR z>'2'");
Grüsse
Color
Beitrag zuletzt geändert: 11.9.2009 14:48:18 von color -
color schrieb:
[...]
oh man, all diese mühe! also, der upload mit der bild-benennung usw usf steht bereits, es sieht so ähnlich aus wie du es mir vorgeschlagen hast - ich hab nur einen weg gefunden, jede chance der gleichen id durch den gleichen uploadzeitpunkt (und sei diese chance noch so gering) auf null zu bringen;
das problem im detail bestand darin, daß ich das letzte hochgeladene bild noch einmal mit dem namen extra irgendwo sichern mußte, wo ich mit flash in der nächsten aktion den namen abholen konnte - denn nur so kam ich an den namen überhaupt heran (die zeit-id wird natürlich auch bei mir vom server geliefert)
und nun hatte ich eben das problem, daß wenn ich ein bild von einem album in ein anderes verschobnen habe, eben dieser anker ebenfallst mit dem neuen album-nahmen überschrieben habe -> plötzlich war zwei mal das gleiche bild in der flash-anwendung und jeder drop-effect usw usf wußte nicht, auf welches element es sich beziehen sollte - kurz = chaos.
naja, nun kann der anker nicht mehr überschrieben werden, alles ist heile.
ich danke euch für die mühe - das meine frage wohl nicht so eindeutig war wie ich dachte sie formuliert zu haben tut mir leid.
ps
gucken und fummeln könnt ihr hier, wenns bedarf gibt (der upload ist deaktiviert, aber funktioniert)
Beitrag zuletzt geändert: 11.9.2009 15:58:40 von sonok -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage