php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 30-04-2008, 14:20
Ashton
 Newbie
Links : Onlinestatus : Ashton ist offline
Registriert seit: Aug 2004
Beiträge: 35
Ashton ist zur Zeit noch ein unbeschriebenes Blatt
Standard [PHP5] Rang Funktion

Hallo,

Ich hab mir etwas zusammen geschustert was nicht wirklich funktioniert. Habe die Schleife auch durch ein exit; gestoppt damit der mir die Ausgabe liefert.

Hier erstmal das Script was durch ein Button ausgeführt wird.

PHP-Code:
if (isset($_POST['hoch'])){
$kat=$_POST['kat'];
$id=$_POST['id'];
$rang=$_POST['rang'];
$rangtmp "$rang";
// Mysql connect     
    
$sql2 "SELECT * FROM download";
       
$result2 mysql_query($sql2) OR die(mysql_error());
    while(
$row2 mysql_fetch_assoc($result2)) 
    {
    
$id2 $row2['id'];
    
$rang2 $row2['rang'];
    
$rangtmp-1;
    if (
$rangtmp == "$rang2"){
    echo 
"stimmt";
    echo 
"<br>";
    echo 
"Aktueller Rang.$rang";
    echo 
"<br>";
    echo 
"Aktuell gezählter Rang.$rangtmp";
    echo 
"<br>";
    echo 
"Rang der ersetzt wird.$rang2";
    exit;
    
mysql_query ("UPDATE download SET rang='$rang' WHERE id='$id2'");
    
mysql_query ("UPDATE download SET rang='$rang2' WHERE id='$id'");
    }

was in meinen Kopf nicht rein will ist das "$rangtmp-1;" nicht eins weniger zählt. denn wenn er das macht würde er sich nicht immer gleich selbst finden.

Oder ist das Script fürn ...... ^^
Wie kann ich das sonst realisieren das ich ein rang austauschen kann?

mfg
Ashton
Mit Zitat antworten
  #2 (permalink)  
Alt 30-04-2008, 14:25
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

$rangtmp-1; ist Blödsinn.

$rangtmp = $rangtmp-1; muss es heißen. Das gehört zu den Grundlagen der Sprache!

Ebenso ist es immer falsch, wenn man "$rang" schreibt. $rang ist eine Variable, es hat keinen Sinn, sie in einen String zu packen um sie zu vergleichen oder zuzuweisen.
Mit Zitat antworten
  #3 (permalink)  
Alt 30-04-2008, 14:39
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
keinen Sinn, sie in einen String zu packen um sie zu vergleichen oder zuzuweisen.
Ausser es geht um eine Zuweisung als Teil eines Strings.
PHP-Code:
echo "Aktueller Rang.$rang"
ist das allerdings auch nicht
PHP-Code:
// entweder
echo "Aktueller Rang" $rang;
// oder
echo "Aktueller Rang $rang"
__________________
Gruss
H2O
Mit Zitat antworten
  #4 (permalink)  
Alt 30-04-2008, 14:45
Ashton
 Newbie
Links : Onlinestatus : Ashton ist offline
Registriert seit: Aug 2004
Beiträge: 35
Ashton ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

oki ^^ nun geht schon mehr als vorher. Aber es funktioniert nur wenn der rang um 1 bei einenander liegt. also ränge gibt es zur zeit nur 15, 14 und 1. von 15 auf 14 gehts ohne weiteres nur von 14 auf 1 gehts nicht als würde die Schleife nicht weiter arbeiten.

PHP-Code:
if (isset($_POST['hoch'])){
$kat=$_POST['kat'];
$id=$_POST['id'];
$rang=$_POST['rang'];
$rangtmp "$rang";
$rangtmp $rangtmp-1;
// Mysql connect    
    
$t=0
    
$sql2 "SELECT * FROM download";
       
$result2 mysql_query($sql2) OR die(mysql_error());
    
$anzahl mysql_num_rows($result2);
    while(
$row2 mysql_fetch_assoc($result2)) 
    {
    
$t++;
    if(
$t == $anzahl){
    
$rangtmp $rangtmp-1;
    
$t=0;
    }
    
$id2 $row2['id'];
    
$rang2 $row2['rang'];
    if (
$rangtmp == $rang2){
    
mysql_query ("UPDATE download SET rang='$rang' WHERE id='$id2'");
    
mysql_query ("UPDATE download SET rang='$rang2' WHERE id='$id'");
    }

Die Ausgabe hatte ich vorher noch drin habe ich entfernt
Habe durch mysql_num_rows die anzahl datensätze rausgefunden und diese lasse ich durch $t vergleichen funktioniert auch aber leider läuft die while schleife nicht weiter. oder macht auf jeden fall kein vergleich mehr ^^.

mfg
Ashton
Mit Zitat antworten
  #5 (permalink)  
Alt 30-04-2008, 14:48
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
$rangtmp = $rangtmp-1;
Oder gleich
PHP-Code:
$rangtmp--; 
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #6 (permalink)  
Alt 30-04-2008, 15:08
Ashton
 Newbie
Links : Onlinestatus : Ashton ist offline
Registriert seit: Aug 2004
Beiträge: 35
Ashton ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hoppla^^

PHP-Code:
if (isset($_POST['hoch'])){
$kat=$_POST['kat'];
$id=$_POST['id'];
$rang=$_POST['rang'];
$rangtmp "$rang";
$rangtmp--;
// Mysql connect    
    
$t=0
    
$sql2 "SELECT * FROM download";
       
$result2 mysql_query($sql2) OR die(mysql_error());
    
$anzahl mysql_num_rows($result2);
    while(
$row2 mysql_fetch_assoc($result2)) 
    {
    if(
$t == $anzahl){
    
$rangtmp--;
    
$t=0;
    }
    
$id2 $row2['id'];
    
$rang2 $row2['rang'];
    if (
$rangtmp == $rang2){
    echo 
"stimmt";
    echo 
"<br>";
    echo 
"Aktueller Rang".$rang;
    echo 
"<br>";
    echo 
"Aktuell gezählter Rang".$rangtmp;
    echo 
"<br>";
    echo 
"Rang der ersetzt wird".$rang2;
    exit;
    
mysql_query ("UPDATE download SET rang='$rang' WHERE id='$id2'");
    
mysql_query ("UPDATE download SET rang='$rang2' WHERE id='$id'");
    }
    
$t++;

Das $t++; sollte auch am ende der schleife stehen sonst vergisst der ja etwas ^^

naja leider funktioniert die schleife bei grösseren sprüngen wie von rang 14 auf 1 nicht. bei rang 15 auf 14 geht des ohne weiteres.

Kann mir einer sagen wodran das liegen kann?
Mit Zitat antworten
  #7 (permalink)  
Alt 30-04-2008, 15:25
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Wieso ist rang in deiner Tabelle ein Stringtyp? Informiere dich mal über SQL-Injections. Und erkläre bitte, was das eigentlich werden soll. Ich vermute, dass das auch mit WHERE in der SELECT-Query und ohne Schleife machbar ist.
Mit Zitat antworten
  #8 (permalink)  
Alt 30-04-2008, 15:32
Ashton
 Newbie
Links : Onlinestatus : Ashton ist offline
Registriert seit: Aug 2004
Beiträge: 35
Ashton ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
Wieso ist rang in deiner Tabelle ein Stringtyp? Informiere dich mal über SQL-Injections. Und erkläre bitte, was das eigentlich werden soll. Ich vermute, dass das auch mit WHERE in der SELECT-Query und ohne Schleife machbar ist.
Über SQL-Injections werde ich mich jetzt erkundigen.

Worum es geht ist folgendes ich habe eine Download Bank und nun möchte ich die Kategorien ordnen. Dies soll mit einer Art Rang System gemacht werdeb.

DB hat id, Kategorie und rang als felder.

diese werde angelegt und sollen wenn nötig geordnet werden. das geschieht über einen Button der das auslöst. (Hoch und Runter)

auf Knopf Druck Hoch soll der rang abgesucht welcher der nächst niedrigere ist.

rang 15, 14 und 1 existieren. Dazwischen die habe ich gelöscht.

von rang 15 auf 14 gehts ohne weiteres aber wenn ich von rang 14 auf 1 möchte das klappt dies nicht wie ich denke müsste das an der while Schleife liegen sehe aber das Problem nicht.

edit: Laut http://de.wikipedia.org/wiki/SQL-Injektion und einigen Foren Einträgen soll verhindert werden das die Seite fehlermeldungen ausspruckt die für den User nicht erkennbar machen soll wo die Lücke ist. Oder habe ich das falsch verstanden?

Also soll ich in der SQL Connection bei or die ( 'Meine Persöhnliche Fehlermeldung reinschreiben' ); gleiche bei ftp funktionen etc.? also wo eine Verbindung aufgebaut wird?

Weiss einer wie ich das Script zum laufen bekomme?

mfg
Ashton

Geändert von Ashton (30-04-2008 um 15:53 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 30-04-2008, 17:21
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

So schwer ist es doch nicht ...

Wenn der Button "hoch" gedrückt wurde, ist die Verschiebung "-1", wenn es "runter" war, dann "+1". Andere Buttons gibt es nicht.

PHP-Code:
if (isset($_POST['hoch'])) {
    
$offset = -1;
} elseif (isset(
$_POST['runter'])) {
    
$offset = +1;
} else die(
'Fehler!'); 
Nun wird das Element um $offset verschoben. Dabei können folgende Fälle eintreten:
1) Die neue Position ist durch ein anderes Element belegt. Die beiden tauschen also die Plätze.
2) Die neue Position ist kleiner als 0.
3) Die neue Position ist größer als die Anzahl der Elemente.

Beachte: Es kann nicht passieren, dass die neue Position unbelegt ist, da ich von einer lückenlosen Liste ausgehe.

Die beiden letzten Fälle könnte man mit einem Fehler quittieren, da man ein Element an erster/letzter Position nicht noch weiter nach oben/unten verschieben kann. Idealerweise gibt es gar keine Buttons dafür.
Falls du das nicht möchtest, gibt es nur eine Alternative: Wenn das erste/letzte Element nach oben/unten verschoben wird, setzt du es ganz an den Anfang bzw. ganz ans Ende. Darauf gehe ich jetzt aber mal nicht weiter ein. Ich halte das ohnehin nicht für besonders benutzerfreundlich.

Bleibt also nur Fall 1 und der ist denkbar einfach.
Sei $id = intval($_POST['id']) und $offset wie oben beschrieben.

UPDATE download SET rang = rang + ($offset) WHERE id = $id
schiebt das Element nach oben oder unten. Jetzt befinden sich zwei Elemente an der selben Position. Das zweite, welches vorher schon dort war, schiebst du nun auf den alten Platz des gerade eben verschobenen Elements. Klingt kompliziert, die Query ist aber ganz einfach:
UPDATE download SET rang = rang - ($offset)
WHERE rang IN (SELECT rang + ($offset) FROM download WHERE id = $id) AND id != $id

Der SELECT-Teil in Klammern besorgt lediglich den Wert von rang, den gerade beide Elemente haben. Mit id != $id wird sichergestellt, dass von den beiden das richtige Element ausgewählt wird.


Alle Angaben ohne Gewähr. Ich habe das gerade einfach so runtergeschrieben. Gewöhnlich vertue ich mich dabei bei den Offsets. Aber das wirst du ja merken.


SQL-Injection hast du noch nicht richtig kapiert. Es geht darum, dass man niemals unegprüft Benutzereingaben in SQL-Queries einbauen sollte. Der Benutzer könnte nämlich Dinge eingeben, die den Sinn der Query verändern. Google noch ein bisschen und lies noch ein paar Artikel dazu.
Tipp: Numerische Werte kann man mit intval() putzen, Strings mit mysql_real_escape_string().
Übrigens bin ich oben davon ausgegangen, dass die Spalte rang numerisch ist. Das ist bei dir im Moment noch nicht so, solltest du aber dahingehend ändern.

Geändert von onemorenerd (30-04-2008 um 17:24 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:44 Uhr.