anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: So 21 Apr, 2019 09:08

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Array aus Datenbank lesen
BeitragVerfasst: Sa 08 Jan, 2011 11:28 
Offline
Eingeweihter
Eingeweihter

Registriert: Mo 31 Aug, 2009 09:26
Beiträge: 67
Geschlecht: Männlich
LoGD: http://nydoria.at
Ich versuch gerade eine Funktion für LotgD zu schreiben, welche in der Datenbank ein Array ablegt, um später einen Wert damit zu vergleichen. Leider komm ich nicht über den ersten Teil hinweg, weil das was ich auslese imemr schon ein Array ist offenbar, und mit Datenbankfunktionen kenn ich mich leider so wenig aus, dass ich eigentlich im Blindflug bin, dachte ich hätte es so gemacht wie an anderen Stellen, aber irgendwas ist wohl vällig falsch. Der Code sieht so aus:
Code:
case "testarrayinsert":
   output ("<form action='burg.php?burgop=testarraysafe' method='POST'>
      Welche Zahl soll in das Array eingefügt werden?`n
      <input type='text' name='zahlarray' size='5' maxlength='5'> Welche Zahl soll eingefügt werden?`n
      <input type ='text' name='loginname' size='12' maxlength='12'> Bei welchem User soll sie eingefügt werden?`n
      <input type='submit' class='button' value='Abschicken'></form>",true);
   allownav("burg.php?burgop=testarraysafe");
   addnav("Zurück",$burgdateilink."?burgop=testarray");
break;

case "testarraysafe":      
   $sql=("SELECT array FROM accounts WHERE login='".$_POST['loginname']."'");
   $result=db_query($sql);
   $fetched=db_fetch_assoc($result);
   output ("Array Error Test ".$result."`n".db_num_rows($result)." rows found.`n Query: <pre>".$sql,"</pre>", true);
   if (is_array($fetched)){
      $testarray=array();
      output("`n`nNew Array Initialized");
   } else {
      $testarray=unserialize($fetched);
      output("`n`nOld Array Used");
   }
   output ("`n`n".serialize($testarray));
   array_push($testarray,$_POST['zahlarray']);
   output ("`n`n".serialize($testarray));
   db_query ("UPDATE accounts SET array='".serialize($testarray)."' WHERE login='".$_POST['loginname']."'");
   addnav("Zurück",$burgdateilink."?burgop=testarray");
break;

Warum der inzwischen so aussieht, ist das bei meinen ersten Versuchen immer zurückkam das unserialize ein array ist aber einen string bräuchte - das wird jetzt zwar abgefangen, funktioniert aber immer noch nicht (Sprich als output wird jedesmal ein neues Array produziert) - und ich hab keine Ahnung warum, ich dachte wenn ich das mit serialize Speichere dann sollte es als string gespeichert werden und nicht als array... tja wie gesagt ich hab kaum Ahnung was ich tue, hab mich zwar durch einiges an PhP Code gewälzt, aber wo ich meine Fehler habe weiß ich nicht.

Ein Standard output nach testarraysafe sieht etwa so aus:
Code:
Array Error Test Resource id #18
1 rows found.
Query: <pre>SELECT array FROM accounts WHERE login='Blabla'

New Array Initialized

a:0:{}

a:1:{i:0;s:1:"7";}


Als zweites wäre noch dass ich wahrscheinlich sicherheitstechnisch irgendwie die ganzen Abfragen maskieren sollte, aber wie das am besten ist, ist mir leider auch nicht klar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Array aus Datenbank lesen
BeitragVerfasst: Sa 08 Jan, 2011 15:09 
Offline
Eingeweihter
Eingeweihter

Registriert: Mi 12 Aug, 2009 18:11
Beiträge: 65
Geschlecht: Männlich
LoGD: http://www.plueschdrache.de
Hallo,
möchtest du denn, dass beim speichern die neuen Werte zu den alten Werte ins Array ergänzt werden, oder eigentlich nur beim abspeichern einfach die vorhandenen Daten ersetzen? Im letzteren Fall kannst du dir ja an der Stelle das auslesen ersparen und brauchst nur noch ein array zu erzeugen, das nach dem serialize in der Datenbank gespeichert wird.

Das Skript wird aber nicht von dem jeweiligen User aufgerufen, oder? Sonst könntest du auch einfach $session['user']['array'] verwenden und die Querys weglassen.

Edit:
Bei deinem vorhanden Code gibt es einen kleinen Fehler. Und zwar liefert dir db_fetch_assoc ja bereits ein array mit dem jeweiligen Datensatz zurück. Das heißt also is_array($fetched) ist immer true, daher wird auch immer ein neues array initialisiert. An dein Feld "array" kommst du über $fetched['array']. Und dann müsste die is_array Überprüfung noch gedreht werden, denn du willst ja ein neues array haben, wenn noch kein array existiert. So müsste es eigentlich passen:

Code:
$oldarray=unserialize($fetched['array']);

if (is_array($oldarray)){
      $testarray=$oldarray;
      output("`n`nOld Array Used");
} else {
      $testarray=array();
      output("`n`nNew Array Initialized");
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Array aus Datenbank lesen
BeitragVerfasst: Sa 08 Jan, 2011 18:13 
Offline
Eingeweihter
Eingeweihter

Registriert: Mo 31 Aug, 2009 09:26
Beiträge: 67
Geschlecht: Männlich
LoGD: http://nydoria.at
Hi!
Danke für die Hilfe, die Lösung funktioniert genau richtig. mein Problem war dass ich nicht genau wusste wie db_fetch_assoc arbeitet (Also dass es mein Array dann, obwohl nur ein Feld geholt wird, auch in einem Array abspeichert *gg*), hatte dann noch was anderes ausprobiert weil ich dachte der Befehl ist einfach falsch. Jetzt verhält sich der Programmteil jedenfalls genau richtig, danke :-)

Gespeichert wird dabei dann übrigens ein anderer User, durch einen User - aber wahrscheinlich nicht in der accounts Tabelle, die ist nur in meinem Übungsteil drinnen.
Deswegen muss ich jetzt noch rausfinden wie ich das ganze gegen Mißbrauch absichere, aber zumindest die Funktionsweise kann ich schonmal herstellen.

Die Werte sollen überschrieben werden, das war zumindest bis jetzt mein Gedanke, aber eben mit Berücksichtigung der vorherigen Werte.
Also teils werden Werte rausgelöscht, teils hinzugefügt und mein Gedanke war dass ich es am besten auslese, das Ausgelesene manipuliere und dann neu einspeichere - wenns bessere Alternativen gibt bin ich da offen für neue Ideen :-)

Wenn das ganze fertig ist wird es wohl dann hier im Forum landen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Array aus Datenbank lesen
BeitragVerfasst: Sa 08 Jan, 2011 19:06 
Offline
Eingeweihter
Eingeweihter

Registriert: Mi 12 Aug, 2009 18:11
Beiträge: 65
Geschlecht: Männlich
LoGD: http://www.plueschdrache.de
Ok, wenn du nur ein Teil der Werte änderst, dann ist das auslesen natürlich nötig. Ich würde aber das array für die übersichtlichere Nutzung anders aufbauen und konkrete Namen für die Indizes vergeben. Mit array_push() bekommst du ja ein array in Form von (0 => 5, 1 => name,...). Besser zu handhaben wäre es denke ich mit (wertx => 5, username => name,...). Heißt also, anstatt array_push packst du dann die Formulardaten ganz normal so rein: testarray['username']=$_POST['loginname']; usw.

Wenn das Feld in der accounts-Tabelle bleibt und von anderen Usern geändert wird, würde ich noch berücksichtigen, dass die Sache dann recht anfällig für den Transferbug sein kann (es gibt hier im Forum irgendwo auch einen Fix, der den zumindest zu vermeiden hilft). Und wenn es drin bleibt, nicht vergessen, das Feld ggf. in der dragon.php zu ergänzen, damit es beim DK nicht wieder auf default gesetzt wird. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Array aus Datenbank lesen
BeitragVerfasst: Sa 08 Jan, 2011 19:39 
Offline
Eingeweihter
Eingeweihter

Registriert: Mo 31 Aug, 2009 09:26
Beiträge: 67
Geschlecht: Männlich
LoGD: http://nydoria.at
Konkrete Namen für die Felder vergeben wäre hilfreich, aber ist nicht möglich. Das Array soll User IDs speichern und gegebenenfalls wieder löschen. Es bleibt auch sicher nicht in der Accounts Tabelle (unter anderem WEGEN dem Transferbug). Im Moment ist der Datentyp in MySql "text" weil alle anderen Array dieser Art (z.B. dragonpoints) auch so geartet sind. - Ich nehme an da MySql keine Arrays speichert ist auch nichts anderes möglich wenn ich in einem Feld mehrere Werte speichern will?
Weil Grundsätzlich würde mir helfen wenn die Datenbank schonmal falsche Fälle abfängt, ansonsten muss ich das halt alles in der Anwendung programmieren :-) mal sehen wie gut ich das hinkriege... Versuchen werd ichs auf jedenfall, dass es so funktioniert wie bei Nachrichten schicken - dass man schließlich aus einer Liste auswählt welches der richtige User ist.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum