SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Der CSS-Problemlöser

Der CSS-Problemlöser zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 29.03.2006, 11:27:39
PHP-MySQL-Fan PHP-MySQL-Fan ist offline
Anfänger
 
Registriert seit: Mar 2006
Beiträge: 9
Problem Datenbankdesign, doppelte Wertevergabe verhindern

Hallo,


folgende Tabelle:
Code:
Spalte_Zaehler  ;  Spalte_TimeStamp  ;  Spalte_Aufruf_ID  ;  Spalte_Attribut  ;  Spalte_Attribut_Wert

(auto_increment); (ON UPDATE CURRENT ;       (INT)        ;     (Varchar)     ;         (Text)
(Primär)        ;     _TIMESTAMP)    ;                    ;

      1           2006-02-01 00:24:41          1            HTTP_REFERER            http://localhost/
      2           2006-02-01 00:24:41          1            HTTP_ACCEPT_LANGUAGE    de
      3           2006-02-01 00:24:41          1            HTTP_USER_AGENT         Mozilla/4.0
      4           2006-03-03 00:24:41          2            HTTP_REFERER            http://localhost/
      5           2006-03-03 00:24:41          2            HTTP_ACCEPT_LANGUAGE    de
      6           2006-03-03 00:24:41          2            HTTP_USER_AGENT         Mozilla/4.0
      7           2006-04-02 00:24:41          3            HTTP_REFERER            http://localhost/
      8           2006-04-02 00:24:41          3            HTTP_ACCEPT_LANGUAGE    de
      9           2006-04-02 00:24:41          3            HTTP_USER_AGENT         Mozilla/4.0

soll durch diese Schelife gefüllt werden:

PHP-Code:
foreach ($_SERVER as $key => $value
{
 
$sql 'INSERT INTO `Datenbank` 
            (`Spalte_Zaehler`, ` Spalte_TimeStamp`, ` Spalte_Aufruf_ID`, ` Spalte_Attribut`, ` Spalte_Attribut_Wert`) 
         VALUES 
            (NULL, NOW(), \''
.$Aufruf_ID.', \' '.$key.'   \', \''   .  $value   .   '\');';
 
$result mysql_query($sql$db);


Das Array "$_SERVER" enthält immer mindestens die 3 Attribute ("HTTP_REFERER", "HTTP_ACCEPT_LANGUAGE", "HTTP_USER_AGENT") mit den dazugehörigen Werten, pro Aufruf der Schleife.
Die Schleife wird immer durch Aufruf des PHP Skriptes aufgerufen.


Die Spalt "Spalte_Aufruf_ID" soll immer eine Integer Nummer bekommen.
Diese Nummer bekommen alle Datensätze die zu demselben Schleifendurchlauf gehören.
Daran soll dann später erkannt werden welche Datensätze zusammengehören (von einem Seitenaufruf stammen).


Jetzt habe ich dazu 2 Fragen:

Der Ansatz sieht vor das:
das Script sich die höchste Nummer aus der Spalte "Spalte_Aufrufer_ID" sucht,
den um einen Wert erhöht und diesen
Wert für den Schleifendurchlauf immer als Variable "$Aufruf_ID" benutzt.

Frage A:
Wie kann ich gewährleisten das:
2 oder mehr zeitgleich erfolgende Aufrufe von 2 oder eben mehr Usern,
die Integer Zahlen der Spalte "Spalte_Aufruf_ID" nicht doppelt vergeben werden?

Kann es passieren das User A das scrippt aufruft,
sich die höchste ID (Nummer) aus der Spalte "Spalte_Aufruf_ID" um 1 addiert und verwendet.
Und dann anfängt den ersten Datensatz in die DB zu schreiben.
User B aber auch kurz nach User A auf das Scrippt zugreift und
bevor der erste Datensatz von User A in die Datenbank geschrieben wurde,
sich das Scrippt auch die höchste ID (Nummer) aus der Spalte "Spalte_Aufruf_ID" holt und
um eines erhöht.
Problem:
Jetzt müsste ja User A und User B dieselbe ID (Nummer) haben,
weil noch nicht der erste Datensatz von User A in die Datenbank eingetragen wurde,
bevor User B sich den aktuell höchsten Wert ausgelesen hat, oder?
Wie kann ich das verhindern, dass User A Datensätze mit User B Datensätzen die Selber Aufruf_ID bekommen?

Muss ich eine 2. Tabelle anlegen die immer die höchste Aufruf_ID enthält und
bevor Datensätze in die Tabelle 1 geschrieben werden, erst hier in Tabelle 2
der Aufruf_ID Counter um eines erhöht wird?

Frage B:
Ist es möglich durch bestimmt "gefälschte" Strings die in die Variablen $key (VARCHAR) und $value(TEXT)
MySQL Befehle ausführen zu lassen? Kann also ein User mit gefälschten Strings für die Variablen Kontrolle
über die Datenbank erhalten? Oder wird der Inhalt der Variabeln immer als Zeichenkette gewertet?
Was passiert wenn der String in einer der Variablen ein Komma, Hochkomma, Semikolon oder andere Steuerzeichen enthält?
Gibt es da einen Schutz / Funktion dafür?

MfG
Mit Zitat antworten
  #2  
Alt 29.03.2006, 12:30:21
R. Woitaschik R. Woitaschik ist offline
Anfänger
 
Registriert seit: Nov 2004
Ort: Düsseldorf
Beiträge: 99
AW: Problem Datenbankdesign, doppelte Wertevergabe verhindern

Hi PHP-MySQL-Fan,

zu A: vor dem Auslesen der Aufruf_ID ein Lock auf die Tabelle ausführen (LOCK TABLE ...). Nach erfolgtem Schreibvorgang ein Unlock ausführen. Während des Locks können andere Prozessen nicht auf die Tabelle zugreifen und landen in einer Warteposition.
zu B: Dies kannst Du verhindern, in dem du deine zu schreibenden Werte vorher durch die Funktion addslashes() änderst.

Gruß
Richard
Mit Zitat antworten
  #3  
Alt 29.03.2006, 15:56:22
Marilu Marilu ist offline
Member
 
Registriert seit: Apr 2003
Ort: 49.54, 8.35 - 3./9
Beiträge: 878
AW: Problem Datenbankdesign, doppelte Wertevergabe verhindern

Zu A u. B:

Doppelte IDs verhindert man i. d. R. durch auto-increment. Dafür müßtest Du aber Deine Tabelle aufdröseln und aus den jeweils 3 Datensätzen einen führenden und drei in einer verbundenen Tabelle machen oder auch aus den je zwei Felden in drei Datensätzen sechs Felder in einem DS bilden.
Mit Zitat antworten
  #4  
Alt 29.03.2006, 16:50:07
PHP-MySQL-Fan PHP-MySQL-Fan ist offline
Anfänger
 
Registriert seit: Mar 2006
Beiträge: 9
AW: Problem Datenbankdesign, doppelte Wertevergabe verhindern

Zitat:
Zitat von R. Woitaschik
Hi PHP-MySQL-Fan,

zu A: vor dem Auslesen der Aufruf_ID ein Lock auf die Tabelle ausführen (LOCK TABLE ...). Nach erfolgtem Schreibvorgang ein Unlock ausführen. Während des Locks können andere Prozessen nicht auf die Tabelle zugreifen und landen in einer Warteposition.
zu B: Dies kannst Du verhindern, in dem du deine zu schreibenden Werte vorher durch die Funktion addslashes() änderst.

Gruß
Richard

Hallo Richard,

"Lock auf die Tabelle" + "Während des Locks können andere Prozessen nicht auf die Tabelle zugreifen und landen in einer Warteposition" => bedeutet das, das wenn ich das Scrippt am anfang einer Webseite include die Webseite erst angezeigt wird wenn das Scrippt auf die Datenbank zugreifen darf? Also es im schlimmsten Fall so ist das der User B warten muß bis ihm die Seite angezeigt wird bis die Datensätzte von User A in die Datenbank geschrieben wurden?

Wäre es ein Lösung das inlcude des Scriptes am ende der Webseite zu tätigen, um so wenigstenes dem User B zu ermöglichen die Seite sofort zu sehen und nicht warten zu müssen bis User A Datensätze in die Datenbank eingetragen wurden?

Zu B)
Ich habe mich da mal hier belesen: addslashes().
Würde diese Funktion auch ein ; erkennen und so verhindern das der Insert Befehl zu früh abgebrochen werden könnte, weil MySQL denkt der Befehl ist zu Ende? Oder werden solche Varablen wie eben $_SERVER auch gekenzeichent so das sie nicht als Code verstanden werden?`

Danke erstmal für die Tips!
MfG
Mit Zitat antworten
  #5  
Alt 29.03.2006, 17:01:40
PHP-MySQL-Fan PHP-MySQL-Fan ist offline
Anfänger
 
Registriert seit: Mar 2006
Beiträge: 9
AW: Problem Datenbankdesign, doppelte Wertevergabe verhindern

Zitat:
Zitat von Marilu
Zu A u. B:

Doppelte IDs verhindert man i. d. R. durch auto-increment. Dafür müßtest Du aber Deine Tabelle aufdröseln und aus den jeweils 3 Datensätzen einen führenden und drei in einer verbundenen Tabelle machen oder auch aus den je zwei Felden in drei Datensätzen sechs Felder in einem DS bilden.
Es sind eigentlich mehr Attribute die eingetragen werden sollen als 3. Gibt es ein Möglichkeit das das Script automatisch die Tabelle um eine Spalte erweitern kann wenn $_SERVER plötzlich ein Attribut mehr liefert? Zum Beispiel wenn erst nur User die Seite besuchen die hinter einer NAT sitzen dann wird kein [HTTP_VIA] und kein [HTTP_X_FORWARDED_FOR] angezeigt, wenn jetzt aber ein User auf die Seite kommt der durch eine Proxy ins www geht dann wird das schon angezeigt. Jetzt müsse das Script die Tabelle automatisch um die Spalten HTTP_VIA und HTTP_X_FORWARDED_FOR ergänzen und die Daten dann für den Datensatz eintragen.
Mit Zitat antworten
  #6  
Alt 30.03.2006, 09:03:07
Marilu Marilu ist offline
Member
 
Registriert seit: Apr 2003
Ort: 49.54, 8.35 - 3./9
Beiträge: 878
AW: Problem Datenbankdesign, doppelte Wertevergabe verhindern

> Jetzt müsse das Script die Tabelle automatisch um die Spalten HTTP_VIA und HTTP_X_FORWARDED_FOR ergänzen und die Daten dann für den Datensatz eintragen.

Ich würde das mit Datensätzen in einer verknüpften Tabelle machen; das sieht wie eine normale 1:n - Relation aus.
Mit Zitat antworten
Antwort


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

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 aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Lokalisierung eines SESSION - Problems Fabian85 PHP für Fortgeschrittene und Experten 5 03.10.2005 20:17:54
doppelte Ausgabe verhindern ! akasa PHP Grundlagen 3 10.06.2005 19:58:28
Doppelte Ergebnisse verhindern thorben PHP Grundlagen 14 07.06.2005 17:52:18


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:32:35 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt