PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Auslesen und beschreiben einer MySQL Datenbank (http://www.selfphp.de/forum/showthread.php?t=15497)

linux23 09.12.2006 13:46:01

Auslesen und beschreiben einer MySQL Datenbank
 
Hi,

ich will für meine Web Seite eine MySQL Datenbank erstellen mit folgenden Funktionen:

1. Es soll eine Spalte für User geben, eine für Passwörter und eine für E-Mail Adressen.

(a) Wie würde die Datenbank aussehen?

2. Wie kann man dann aus der Datenbank bestimmte Felder auslesen? Wenn man zum Beispiel das Passwort von "user1" auslesen will, was muss man da machen?

3. Wie kann man eine Datenbank bearbeiten? Wenn man Zum Beispiel die E-Mail Adresse von "user1" bearbeiten will?

4. Wie kann man bestimmte Zellen oder Spalten aus der Datenbank entfernen? Wenn man zum Beispiel "user1" löschen will, was muss man da machen?

Es wäre toll, wenn mir jemand helfen kann! Vielen Dank schon mal jetzt für die Hilfe.

VG linux23

BenniG. 09.12.2006 13:58:48

AW: Auslesen und beschreiben einer MySQL Datenbank
 
Am besten liest du dir erstmal was zum thema durch, das hier von null auf zu erklären ist recht langwierig und foren sind ja für konkrete probleme...
http://ffm.junetz.de/members/reeg/DSP/

Damir 09.12.2006 14:01:40

AW: Auslesen und beschreiben einer MySQL Datenbank
 
Da hat BenniG. recht... Schau dir erst einmal die Grundlagen an. Danach brauchst du für deine Ansprüche die Befehle SELECT, INSERT, UPDATE und DELETE.

Ist einfacher als du denkest, wirklich....

Damir

marc26 09.12.2006 14:33:03

AW: Auslesen und beschreiben einer MySQL Datenbank
 
Die beiden haben natürlich recht..., aber hier vielleicht eine kleine Einstiegshilfe:

Die Datenbank: (mySQL / Name: users)

user_id (auto-increment, primary key)
user_name (text)
user_password (text)
user_email (text)

Die Datenbank-Connection: (mySQL / Name: users)
Normalerweise lagert man die Datenbank-Connection in eine externe PHP Datei aus (z.B. conn.php) und verlinkt auf jeder Seite, auf der man Datenbankverbindungen benötigt vorher auf die conn.php.

conn.php kann so aussehen (in diesem Fall lokal auf deinem Rechner):

PHP-Code:

<?php
$hostname_connDB 
"localhost";
$database_connDB "users";
$username_connDB "root";
$password_connDB "1234";
$connDB mysql_connect($hostname_connDB$username_connDB$password_connDB) or trigger_error(mysql_error(),E_USER_ERROR); 
?>

Auf der Seite, auf der du eine Datenbankverbindung (wie die folgenden erstellen willst), verlinkst du gleich zu Beginn auf die conn.php Connection Seite):

PHP-Code:

<?php
// db connection
require_once('conn.php');
?>

Das Einfügen: (mySQL)
Die user_id wird nicht von dir eingefügt, sondern das erledigt die Datenbank durch die Einstellung 'auto-increment' alleine. Das ist wichtig, damit jedem Datensatz eine unverwechselbare ID (user_id) zugewiesen wird, anhand derer du z.B. in der Select Anweisung durch deine Datensätze navigieren kannst. Es kann so (auf der technischen Seite) nie zu Verwechslungen kommen, selbst wenn du es zulassen würdest, dass mehrere User den selben Namen haben.

PHP-Code:

<?php
// get user info
$user_name 'Klaus';
$user_pasword 'xray23';
$user_email 'mailto@muster.de';

// insert user info
$insertSQL "
INSERT INTO users (
user_name,
user_password,
user_email


VALUES (
'"
.$user_name."',
'"
.$user_password."',
'"
.$user_email."'
)"
;    

mysql_select_db($database_connDB$connDB);
$result mysql_query($insertSQL$connDB) or die(mysql_error());
?>

Das Auslesen eines einzelnen Datensatzes: (mySQL)
In diesem Fall wird das Passwort eines einzelnen Users erfragt. Die Anzahl der auszugebenden Datensätze begrenzt man mit 'LIMIT = 1'.

PHP-Code:

<?php
// get user_id
$user_id 1;

// get user password
mysql_select_db($database_connDB$connDB);
$query_rsGetUserPassword "

SELECT * 
FROM users
WHERE users.user_id = '"
.$user_id."'
LIMIT 1
"
;

$rsGetUserPassword mysql_query($query_rsGetUserPassword$connDB) or die(mysql_error());
$row_rsGetUserPassword mysql_fetch_assoc($rsGetUserPassword);
$totalRows_rsGetUserPassword mysql_num_rows($rsGetUserPassword);

// echo result: user_password
echo $row_rsGetUserPassword['user_password'];
?>

oder wenn du die Ausgabe direkt im HTML unterbringen willst:
Code:

<b><?= $row_rsGetUserPassword['user_password'] ?></b>
Das Auslesen mehrerer Datensätze: (mySQL)
In diesem Fall sollen alle User Namen und die dazugehörigen Passwörter erfragt werden. Die Anzahl der auszugebenden Datensätze kann man wiederum mit 'LIMIT = 10' berenzen oder man lässt 'LIMIT' einfach weg dann werden alle Datensätze ausgegeben. Mit 'ORDER BY' lässt sich die Reihenfolge der Datensätze beeinflussen. 'ASC' steht für 'ascending' (aufsteigend: 1,2,3,4 o. a,b,c,d) und DESC steht für 'descending' (absteigend: 4,3,2,1 o. d,c,b,a).

Damit man gegebenenfalls auf das Ergebnis dieser Datenbankabfrage mehrfach zurückgreifen kann, packen wir die gefundenen Datensätze in ein Array ($allUserInfo). Auf den Inhalt dieses Arrays greift man dann zurück, wenn man die User Namen und Passwörter im HTML darstellen will.

Übrigens: Das * hinter dem Select sagt aus, dass diese Abfrage die Daten aus jeder Datenbanktabellenspalte (dh. user_id,user_name,user_password,user_email) abfragt. Da wir für unsere Ausgabe von User Namen und User Passwörtern aber nicht alle brauchen, könnte man das Sternchen auch durch die einzelnen Spalten, die man braucht ersetzen: SELECT users.user_name, users.user_password. Für unser Beispiel ist das jetzt egal, dennoch sollte man sich das angewöhnen, da bei grossen Datenbanken die Menge der überflüssig abgefragten Spalten auf die Performance geht.

PHP-Code:

<?php
// get user info
mysql_select_db($database_connDB$connDB);
$query_rsGetUserInfo "

SELECT * 
FROM users
ORDER BY users.user_name ASC
LIMIT 10
"
;

$rsGetUserInfo mysql_query($query_rsGetUserInfo$connDB) or die(mysql_error());
$row_rsGetUserInfo mysql_fetch_assoc($rsGetUserInfo);
$totalRows_rsGetUserInfo mysql_num_rows($rsGetUserInfo);

// results in array
do { 

    
$allUserInfo[] = $row_rsGetUserInfo

} while (
$row_rsGetUserInfo mysql_fetch_assoc($rsGetUserInfo));
?>

Im HTML sähe die Ausgabe in einer Tabelle dann so aus (du kannst den HTML Code jederzeit durch PHP Code unterbrechen, solange der in <?php ... ?> eingeschlossen ist):
PHP-Code:

<table>
<?php
// loop array
foreach ($allUserInfo as $item => $value) {

    echo 
'

    <tr>
      <td>
          <b><?= $value['
user_name'] ?></b>
      </td>
      <td>
          <?= $value['
user_password'] ?>
      </td>
    </tr>

    '
;

}
?>
</table>

Das Ändern: (mySQL)

PHP-Code:

<?php
// get user_id
$user_id 1;

// get new user_password
$newpassword 'lkwpeter';

// update user_password
mysql_select_db($database_connDB$connDB);
$query "UPDATE users SET user_password = '".$newpassword."' 
WHERE user_id = '"
.$user_id."'";
mysql_query($query);
?>

Das Löschen: (mySQL)

PHP-Code:

<?php
// get user_id
$user_id 1;

// delete user_password
mysql_select_db($database_connDB$connDB);
$query "DELETE FROM users WHERE user_id = '".$user_id."'";
mysql_query($query);
?>


Damir 09.12.2006 14:37:49

AW: Auslesen und beschreiben einer MySQL Datenbank
 
@marc26
Danke das du dir die Zeit genommen hast!!!!

marc26 09.12.2006 14:43:43

AW: Auslesen und beschreiben einer MySQL Datenbank
 
es sieht wahrlich komplizierter aus als es ist...

SVEN22 10.12.2006 13:27:16

AW: Auslesen und beschreiben einer MySQL Datenbank
 
hey marc, hat mir sehr weitergeholfen, 2 kleine Probleme hab ich noch a) ich möchte überprüfen, ob das wirklich eine Email Adresse ist und b) ich möchte die Tabellenzeilen abwechselnd mit unterschiedlichen Hintergrundfarben versehen. Vielleicht kannst du das noch ergänzen. Danke

marc26 10.12.2006 14:37:43

AW: Auslesen und beschreiben einer MySQL Datenbank
 
Vor dem Einfügen: Validierung
Weil es gefragt wurde, kurz ein paar Worte zur Validierung. Es ist immer gut zu wissen, was man sich so alles in die Datenbank schreibt. Bestenfalls habt ihr z.B. Tausende von Anmeldungen und ein paar Spinner sind immer darunter, die versuchen euch und eurer DB zu schaden. In einem ersten Schritt sollte man die Daten, die aus einem Formular kommen validieren, auch wenn es sich um so scheinbar harmlose Dinge wie Email Adressen und User Namen handelt.

Drei Fälle sind eigentlich gängig:

a) Überprüfen, welche Länge ein String hat
PHP-Code:

<?php
// set max. length
$maxlength 50;

// get form data
$user_name $_POST['user_name'];

// check length
if (strlen($user_name) > $maxlength) {

     
// redirect to error page
    
header ("Location: error.php");

}
?>

b) Überprüfen, ob es sich dabei ausschliesslich um Zahlen und Buchstaben handelt
Diese Überprüfung kann mit 'normalem' PHP ziemlich lang werden, deshalb bedient man sich hier gerne einer 'Regular Expression' (regexp).

PHP-Code:

<?php
// function: only letters and numbers allowed
function onlyLettersNumbers($string) {
    
    
$eregi eregi_replace("([A-Z0-9]+)","",$string);
 
    if (empty(
$eregi)) {
  
        return 
true;
    }
 
return 
false;

// get form data
$user_name $_POST['user_name'];

// check letters and numbers
if (onlyLettersNumbers($user_name) == false) {

    
// redirect to error page
    
header ("Location: error.php");

}


?>

c) Überprüfen, ob eine Email Adresse gültig ist
Ob eine Email Adresse wirklich gültig ist, also ob sie wirklich existiert, kann man so natürlich nicht überprüfen. Allerdings kann man kontrollieren, ob die eingegebene Email Adresse zumindest so aussieht, d.h. alle Elemente einer Email Adresse hat. Die folgende Funktion muss man nicht komplett verstehen, was sie tut ist aber relativ simpel: sie überprüft, ob ein@ Zeichen vorhanden ist, ob sich vor dem @ Zeichen zugelassene Zeichen befinden, ob sich danach zugelassene Zeichen befinden, ob danach ein Punkt folgt und danach wiederum mind. 2 zugelassene Zeichen für den Domain Namen.

PHP-Code:

<?php
function checkEmail($email) {
    
// First, we check that there's one @ symbol, and that the lengths are right
    
if (!ereg("^[^@]{1,64}@[^@]{1,255}$"$email)) {
    
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
    
return false;
    }
    
    
// Split it into sections to make life easier
    
$email_array explode("@"$email);
    
$local_array explode("."$email_array[0]);
    for (
$i 0$i sizeof($local_array); $i++) {
        if (!
ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$"$local_array[$i])) {
        return 
false;
        }
    } 
     
    if (!
ereg("^\[?[0-9\.]+\]?$"$email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
        
$domain_array explode("."$email_array[1]);
        if (
sizeof($domain_array) < 2) {
            return 
false// Not enough parts to domain
        
}
        for (
$i 0$i sizeof($domain_array); $i++) {
            if (!
ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$"$domain_array[$i])) {
            return 
false;
            }
        }
    }

return 
true;

}

// get form data
$user_email $_POST['user_email'];

// check if email is valid
if (checkEmail($user_email) == false) {

  
// redirect to error page
  
header ("Location: error.php");

}
?>


Vor dem Einfügen: SQL Injections verhindern
Um zu verhindern, dass nach der Eingabe von Formulardaten aus Eurer INSERT Anweisung eine DELETE Anweisung wird, sollte man sich einmal mit dem Thema 'SQL Injections' auseinandersetzen. Im Kern geht es darum, dass bestimmte Formulareingaben dazu führen können, dass Euer SQL Code 'erweitert' wird - und das kann Schaden anrichten. Wie man diesem Problem begegnet kann unterschiedlich sein, es hängt von Eurer Version und bestimmten Konfigurationen ab. Ein gutes Stichwort hierzu: 'magic_quotes'.

Die folgende Funktion führt dazu, dass Eure Formulareingaben vor der Verwendung in einem SQL Statement 'escaped' werden. D.h., dass Zeichen die schädlich sein könnten z.B. Hochkommas mit einem \ (Slash) versehen werden, so dass Sie im SQL Statement keinen Schaden mehr anrichten können.

Die Funktion fährt zweigleisig, so dass 'escaped' wird, unabhängig davon ob magic_quotes an- oder ausgeschaltet sind.

PHP-Code:

<?php
function noInjection($value) {
   
   
// Stripslashes
   
if (get_magic_quotes_gpc()) {
       
$value stripslashes($value);
   }
   
   
// Quote if not a number or a numeric string
   
if (!is_numeric($value)) {
       
$value mysql_real_escape_string($value);
   }
   
   return 
$value;
}
?>

Die Werte in Eurem SQL Statement lasst ihr jetzt z.B. vor dem Insert durch diese Funktion laufen:

PHP-Code:

<?php
// get user info
$user_name 'Klaus';

// insert user info
$insertSQL "
INSERT INTO users (
user_name


VALUES (
'"
.noInjection($user_name)."'
)"
;    

mysql_select_db($database_connDB$connDB);
$result mysql_query($insertSQL$connDB) or die(mysql_error());
?>

Zum Thema Sicherheit gibt es in PHP/SQL sehr viel zu sagen, mit einer vernünftigen Validierung und den magic_quotes fahrt ihr aber zunächst einmal schon sehr gut.

marc26 10.12.2006 15:13:22

AW: Auslesen und beschreiben einer MySQL Datenbank
 
Das Auslesen mehrerer Datensätze mit modulo (z.B. abwechselndem Zeilenhintergrund):
Der 'modulo' ist schon fast ein Reizthema in Foren. Deshalb vielleicht nochmal ganz einfach. Der 'modulo' ist ein Zähler, der so lange zählt, wie ihr es ihm sagt und sich ständig wiederholt bis er kein Futter mehr hat.

Ein Beispiel:
PHP-Code:

<?php
// Futter
$total 10;

for (
$i=0;$i<$total;$i++) {

    echo 
'Futter: '.$i.' - Modulo: '.($i%4).'<br/>'// modulo Durchläufe: 4, d.h. 0,1,2,3,0,1,2,3 usw.

}
?>

Bei einem 'modulo' von 4 sieht die Ausgabe dann so aus:

Code:

Futter: 0 - Modulo: 0
Futter: 1 - Modulo: 1
Futter: 2 - Modulo: 2
Futter: 3 - Modulo: 3
Futter: 4 - Modulo: 0
Futter: 5 - Modulo: 1
Futter: 6 - Modulo: 2
Futter: 7 - Modulo: 3
Futter: 8 - Modulo: 0
Futter: 9 - Modulo: 1

Dieses Verhalten hilft, wenn man z.B. in einer Tabellenausgabe die Hintergrundfarbe der einzelnen Zeilen abwechselnd weiss und grau darstellen will. Dazu muss man statt eines modulos von 4 (wie im Beispiel) den modulo auf 2 stellen (d.h. er zählt in der Schleife immer nur 0,1,0,1,0,1 usw.). Die Ausgabe der Tabellenzeilen erweitert man jetzt um ein IF und weist an, dass der Hintergrund bei einem modulo-Wert von 0 bitte den Farbwert '#ffffff' haben soll und im Falle des modulo-Werts von 1 den Farbwert '#cccccc'. Das 'Futter' aus dem obigen Beispiel ($total = 10) ergibt sich aus der Gesamtzahl der Datensätze, die man aus der Datenbank abgefragt hat. Sie stehen in der Variable $totalRows_rsGetUserInfo.

Also zunächst die Datenbankabfrage (wie gehabt):

PHP-Code:

<?php
// get user info
mysql_select_db($database_connDB$connDB);
$query_rsGetUserInfo "

SELECT * 
FROM users
ORDER BY users.user_name ASC
LIMIT 10
"
;

$rsGetUserInfo mysql_query($query_rsGetUserInfo$connDB) or die(mysql_error());
$row_rsGetUserInfo mysql_fetch_assoc($rsGetUserInfo);
$totalRows_rsGetUserInfo mysql_num_rows($rsGetUserInfo);

// results in array
do { 

    
$allUserInfo[] = $row_rsGetUserInfo

} while (
$row_rsGetUserInfo mysql_fetch_assoc($rsGetUserInfo));
?>

Jetzt die HTML Ausgabe erweitert um den 'modulo':

PHP-Code:

<table>
<?php
// reset counter
$i 0;

// loop array
foreach ($allUserInfo as $item => $value) {

    if ((
$i%2) == 0) { // modulo 2 (0,1,0,1,0,1 etc.)

        // bg color: white
        
echo '
    
        <tr style="background-color:#FFFFFF;">
        
            <td>
                <b><?= $value['
user_name'] ?></b>
            </td>
        
            <td>
                <?= $value['
user_password'] ?>
            </td>
        
        </tr>
    
        '
;

    } else {
        
        
// bg color: grey
        
echo '
    
        <tr style="background-color:#CCCCCC;">
        
            <td>
                <b><?= $value['
user_name'] ?></b>
            </td>
        
            <td>
                <?= $value['
user_password'] ?>
            </td>
        
        </tr>
    
        '
;

    }
    
    
// set counter +1
    
$i++;
}
?>
</table>



Alle Zeitangaben in WEZ +2. Es ist jetzt 09:19:01 Uhr.

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