• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Fatal error: Call to undefined function mysql_fatch_assoc()

wolli22

Neues Mitglied
Hy,

Bekomme folgende medung :

Fatal error: Call to undefined function mysql_fatch_assoc() in /users/xxxxx/www/kommentarfunktion/lesen.php on line 10

PHP:
<?php
session_start();

include("connect.php");

$lesen = mysql_query("SELECT * FROM kommentar ") or die (mysql_error());

$rows = mysql_num_rows($lesen);

while($row = mysql_fatch_assoc($lesen)) {

    $id = $row["id"];
    
    $watt = $row["watt"];
    
    $ertrag = $row["ertrag"];
    
    $name = $row["name"];
    
    $email = $row["email"];
    
    $kommentar = $row["kommentar"];
    
    $datum = $row["datum"];
    
    echo $name." hat am ".$datum." einen Eintrag hinterlassen:";


}





?>
 
Hmm ein neuer Fehler :(

Wenn ich nun ein Kommentar abgebe passiert folgendes

[h=2]Column count doesn't match value count at row 1[/h]

Kommentarfunktion

hier meine php dateien:

index.php

PHP:
<?php
session_start();

include("connect.php");


?><html>
<head>
<title>Kommentarfunktion</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script>
<script type="text/javascript">
$(document).ready(function() {

$("input#submit").click(function(){
var watt = $("input#watt").val();
var ertrag = $("input#ertrag").val();
var name = $("input#name").val();
var email = $("input#email").val();
var kommentar = $("textarea#kommentar").val();

if( watt == "" || name == "" || email == "" || kommentar == ""){

    alert("Bitte fuellen Sie alle Felder aus!");
    
}

else{
    $.post( 'kommentar.php',{
        watt: $("#watt").val(),
        ertrag: $("#ertrag").val(),
        name: $("#name").val(),
        email: $("#email").val(),
        kommentar: $("#kommentar").val(),
        
        },
        function(output){
        
        $("#anzeigen").html(output).fadIn(1000);
    
    
    
    });


}

});

});


</script>
</head>

<body>


</body>


<?php
include("lesen.php");
?>

<div id="anzeigen">



</div>


<form name="form">
<h3>Kommentar abgeben</h3>

Watt: <select name="watt" id="watt">
            <option value="">-</option>
            <option value="250">250</option>
            <option value="400">400</option>
            <option value="600">600</option>
            <option value="1000">1000</option>
        </select>
        <br/><br/>
        
Ertrag:<input type="text" name="ertrag" id="ertrag"><br/><br/>
Name <input type="text" name="name" id="name"/><br/><br/>
Email <input type="text" name="email" id="email"/><br/><br/>

Kommentar<br />
<textarea cols="30" rows="15" name="kommentar" id="kommentar"></textarea><br/><br/>

<input type="button" value="Abgeben" id="submit" name="submit">

</form>


</html>

kommentar.php

PHP:
<?php
session_start();

include("connect.php");

$watt = $_POST["watt"];
$ertrag = $_POST["ertrag"];
$name = $_POST["name"];
$email = $_POST["email"];
$kommentar = $_POST["kommentar"];
$date = date("d.m.Y.");
$time = date("H:i");
$datum = "$date - $time";

mysql_query("INSERT INTO kommentar VALUES('$watt','$ertrag','$name','$email','$kommentar','$datum')") or die (mysql_error());

    echo $name." hat am ".$datum." einen Eintrag hinterlassen:<br />";
    echo "<b>" .$kommentar."</b>";






?>


Hm was mach ich falsch ?
 
Wenn man mit einer SQL Datenbank arbeitet sollte man IMMER die Spalten die man ansprechen möchte mit angeben. Dadurch kann man den Code erstens besser Lesen und zweitens bist du bei späteren Änderungen besser gegen eventuelle Fehler geschützt.

Also anstadt

Code:
INSERT INTO ... VALUES (..., ..., ...)

lieber so

Code:
INSERT INTO ... (spalte1, spalte2, spalte3) VALUES (..., ..., ...)
 
Wenn man mit einer SQL Datenbank arbeitet sollte man IMMER die Spalten die man ansprechen möchte mit angeben. Dadurch kann man den Code erstens besser Lesen und zweitens bist du bei späteren Änderungen besser gegen eventuelle Fehler geschützt.


Also anstadt

Code:
INSERT INTO ... VALUES (..., ..., ...)

lieber so

Code:
INSERT INTO ... (spalte1, spalte2, spalte3) VALUES (..., ..., ...)

ok werd ich machen danke...

Mal ne frage , ist mein login script sicher ?



login.php

PHP:
<?php

session_start();

$username = $_POST[username];
$password = $_POST[password];

if ($username&&$password)
{

 $connect = mysql_connect("localhost","xxx","xxx") or die ("Couldn't connect!");
 mysql_select_db("xxx") or die ("Couldn't find DB");

 $query = mysql_query("SELECT * FROM xxx WHERE username='$username'");

$numrows = mysql_num_rows($query);

if ($numrows!=0)
{

    while ($row = mysql_fetch_assoc($query))
    {
        $dbusername = $row ['username'];
        $dbpassword = $row ['password'];
    }
    
    // ceck to see if they match!
    if ($username==$dbusername&&md5($password)==$dbpassword)
    {
    echo "You are logged in! <a href='member.php'>Click</a> here to enter the member pgae.";
    $_SESSION['username']=$username;
    
    }
    else
        echo "Incorrect password!";
    
    

}
else
    die("User doesn't exist!");


echo $numrows;

}
else
    die("Please enter a username and a password!");






?>


member.php

PHP:
<?php

session_start();

if (isset($_SESSION['username']))
echo "Welcome, ".$_SESSION['username']."!<br><a href='logout.php'>Logout</a>";
else
    die("You must be logged in!");
?>

Register.php

PHP:
<?php
echo "<h1>Register</h1>";

$submit = $_POST['submit'];

//form data
$nickname = strip_tags($_POST ['nickname']);
$password = strip_tags($_POST ['password']);
$repeatpassword = strip_tags($_POST ['repeatpassword']);
$date = date ("Y-m-d");

if ($submit)
{

//check for existance
if ($nickname&&$password&&$repeatpassword)
{


if ($password==$repeatpassword)
{
//check char lenght of username and nickname
if (strlen($nickname)>25)
{
echo "Lenght of username ist too long!";
}
else
{
//check password lenght
if (strlen($password)>25||strlen($password)<6)
{
echo "Password must be between 6 and 25 characters";
}
else
{
//register the user!

//encrypt password
$password = md5($password);
$repeatpassword = md5($repeatpassword);

//open database
$connect = mysql_connect("xxx","xxx","xxx");
mysql_select_db("xxxx");//select DB

$queryreg = mysql_query("
INSERT INTO xxxx VALUES ('','$nickname','$password','$repeatpassword')

");
echo "You have benn registred! <a href='form.php'>Return to login Page</a>";

}

}

}
else
    echo "Your password do not match!";


}
else
    echo "Please fill in <b>all</a> fields!";

}


?>


<html>
<form action='register.php' method='POST'>
    <table>
        <tr>
            <td>
            Your Nickname:
            </td>
            <td>
<input type='text' name='nickname' value='<?php echo $nickname; ?>'>
            </td>
        </tr>
        
                <tr>
            <td>
            Choose a password:
            </td>
            <td>
<input type='password' name='password'>
            </td>
        </tr>
        
                <tr>
            <td>
            Repeat your password:
            </td>
            <td>
<input type='password' name='repeatpassword'>
            </td>
        </tr>
    
    </table>
    <p>
    <input type='submit' name='submit' value='Register'>
</html>
 
Wenn du error_reporting einsetzt (als erste Anweisung in jedem Skript), hat PHP da so einige Anmerkungen.

PHP:
error_reporting(-1); // Setzt alle Bits, zeigt alle Fehler/Warnungen/Notizen an
ini_set('display_errors', true); // Eventuell notwendig, meist nicht

- PHP: error_reporting - Manual
 
Das Login Script würde ich so machen:
PHP:
session_start();
if (isset($_POST['username'], $_POST['password'])) {
	$username = $_POST['username'];
	$password = $_POST['password'];
	
	$connect = mysql_connect("localhost", 'xxx', 'xxx') or die("Couldn't connect!");
	mysql_select_db('xxx', $connect) or die("Couldn't find DB");
	
	$sql = "select * from xxx where username = '".mysql_real_escape_string($username)."' and password = '".md5($password)."'";
	$result = mysql_query($sql, $connect);
	
	if ($row = mysql_fetch_assoc($result)) {
		echo 'You are logged in! <a href="member.php">Click</a> here to enter the member page.';
		$_SESSION['username'] = $username;
	} else {
		echo 'Incorrect username or password!';
	}
	mysql_free_result($result);
} else {
	echo 'Please submit the form.';
}

Du überprüfst nämlich nicht, ob die Formularelemente existieren, du machst das auf gut Glück.
Außerdem, halte ich es für sicherer, wenn man dem Benutzer nicht sagt, ob das Passwort oder der Benutzername falsch ist. Dieselbe Fehlermeldung für beide Fälle gibt dem Angreifer nicht einmal den Hinweis, ob er auf der richtigen Spur ist.
Du hast im Übrigen den Tipp, den man dir gegeben hat nicht befolgt: mysql_real_escape_string benutzen!
Den Rest habe ich ein wenig geändert, war aber in deiner Form ok.

member.php ist ok.

register.php


PHP:
<?php
echo '<h1>Register</h1>';

if  (isset($_POST['submit'], $_POST['nickname'], $_POST['password'], $_POST['repeatpassword'])) {
	$nickname = $_POST['nickname'];
	$password = $_POST['password'];
	$repeated = $_POST['repeatpassword'];
	$date = date('Y-m-d');
	
	$errors = array();
	
	if (strlen($nickname) > 25) {
		$errors[] = 'The username is too long.';
	}
	if (strlen($nickname) === 0) {
		$errors[] = 'The username is too short.';
	}
	if ($password !== $repeated) {
		$errors[] = 'The passwords do not match.';
	}
	if (strlen($password) < 6) {
		$errors[] = 'The password is too short.';
	}
	if (count($errors) === 0) {
		$connect = mysql_connect('xxx', 'xxx', 'xxx');
		mysql_select_db('xxxx', $connect);
		mysql_query("insert into xxx values ('', '".mysql_real_escape_string($nickname)."', '".md5($password)."')");
		echo 'Your account has been created.';
	} else {
		echo '<p>Errors: '.implode('<br />', $errors).'</p>';
	}
} else {
	$nickname = '';
}
?>
Wieder einmal überprüfst du nicht gut genug, ob das Formular auch wirklich abgeschickt wurde.
Du überprüfst nicht, ob der Benutzername ok ist und du kürzt den Benutzernamen, ohne den Benutzer darüber zu informieren, mit strip_tags. Lass HTML-Tags einfach stehen und escape sie jedes Mal, wenn du ihn anzeigst mit htmlspecialchars.
Da das Passwort mit MD5 verschlüsselt wird, brauchst du dort erst recht nichts zu modifizieren. Und ein oberes Limit für die Passwortlänge halte ich in Verbindung mit md5 sowieso sinnlos (außer vielleicht das Limit auf 255 o. Ä. setzen).
Du überprüfst falsch, ob die Passwörter identisch sind:
apfel ist nicht gleich Apfel, das siehst du an den erzeugten md5s erst recht. Benutze den ===-Operator statt den ==-Operator.
Mal wieder, benutzt du nicht mysql_real_escape_string. Und wozu speicherst du die Passwortwiederholung?
 
Das Login Script würde ich so machen:
PHP:
session_start();
if (isset($_POST['username'], $_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    $connect = mysql_connect("localhost", 'xxx', 'xxx') or die("Couldn't connect!");
    mysql_select_db('xxx', $connect) or die("Couldn't find DB");
    
    $sql = "select * from xxx where username = '".mysql_real_escape_string($username)."' and password = '".md5($password)."'";
    $result = mysql_query($sql, $connect);
    
    if ($row = mysql_fetch_assoc($result)) {
        echo 'You are logged in! <a href="member.php">Click</a> here to enter the member page.';
        $_SESSION['username'] = $username;
    } else {
        echo 'Incorrect username or password!';
    }
    mysql_free_result($result);
} else {
    echo 'Please submit the form.';
}

Du überprüfst nämlich nicht, ob die Formularelemente existieren, du machst das auf gut Glück.
Außerdem, halte ich es für sicherer, wenn man dem Benutzer nicht sagt, ob das Passwort oder der Benutzername falsch ist. Dieselbe Fehlermeldung für beide Fälle gibt dem Angreifer nicht einmal den Hinweis, ob er auf der richtigen Spur ist.
Du hast im Übrigen den Tipp, den man dir gegeben hat nicht befolgt: mysql_real_escape_string benutzen!
Den Rest habe ich ein wenig geändert, war aber in deiner Form ok.

member.php ist ok.

register.php


PHP:
<?php
echo '<h1>Register</h1>';

if  (isset($_POST['submit'], $_POST['nickname'], $_POST['password'], $_POST['repeatpassword'])) {
    $nickname = $_POST['nickname'];
    $password = $_POST['password'];
    $repeated = $_POST['repeatpassword'];
    $date = date('Y-m-d');
    
    $errors = array();
    
    if (strlen($nickname) > 25) {
        $errors[] = 'The username is too long.';
    }
    if (strlen($nickname) === 0) {
        $errors[] = 'The username is too short.';
    }
    if ($password !== $repeated) {
        $errors[] = 'The passwords do not match.';
    }
    if (strlen($password) < 6) {
        $errors[] = 'The password is too short.';
    }
    if (count($errors) === 0) {
        $connect = mysql_connect('xxx', 'xxx', 'xxx');
        mysql_select_db('xxxx', $connect);
        mysql_query("insert into xxx values ('', '".mysql_real_escape_string($nickname)."', '".md5($password)."')");
        echo 'Your account has been created.';
    } else {
        echo '<p>Errors: '.implode('<br />', $errors).'</p>';
    }
} else {
    $nickname = '';
}
?>
Wieder einmal überprüfst du nicht gut genug, ob das Formular auch wirklich abgeschickt wurde.
Du überprüfst nicht, ob der Benutzername ok ist und du kürzt den Benutzernamen, ohne den Benutzer darüber zu informieren, mit strip_tags. Lass HTML-Tags einfach stehen und escape sie jedes Mal, wenn du ihn anzeigst mit htmlspecialchars.
Da das Passwort mit MD5 verschlüsselt wird, brauchst du dort erst recht nichts zu modifizieren. Und ein oberes Limit für die Passwortlänge halte ich in Verbindung mit md5 sowieso sinnlos (außer vielleicht das Limit auf 255 o. Ä. setzen).
Du überprüfst falsch, ob die Passwörter identisch sind:
apfel ist nicht gleich Apfel, das siehst du an den erzeugten md5s erst recht. Benutze den ===-Operator statt den ==-Operator.
Mal wieder, benutzt du nicht mysql_real_escape_string. Und wozu speicherst du die Passwortwiederholung?

Hmm ok dankeschön,
Seh schon das ich noch viel sogar sehr viel zu lernen hab :)
Das mit der passwortwiederhohlung ist nicht notwendig seh ich auch ein !
Danke für deine mühe :)
 
Ist hier zwar gerade ein wenig Off-Topic aber ist eine Information die sich in deinem Stadium des Programmieren lernens durchaus lohnt.

Es macht absolut KEINEN Sinn dem User vorzuschreiben wie lang sein Passwort sein soll. Wenn der User unbedingt ein Passwort will das kürzer ist als hier im beispiel 6 Zeichen dann soll er es auch bekommen. Viel sinnvoller ist es den User darauf hinzuweisen das sein Passwort ein wenig kurz und somit evtl unsicher ist und diese Information auch in deiner Datenbank zu speichern fals es mal zu einem Support-Fall kommt.
 
Ohne Zeichenbeschränkung könnte man eventuell einen Buffer Overflow erreichen - ich persönlich würde mit substr eine bestimmte Anzahl an Zeichen des Benutzernamens und des Passworts abschneiden - zusätzlich zu den maxlength-Attributen.

Passworter würd ich mit dem Securiy Hash Algorithmsu oder mit bcrypt verschlüsseln.


//Edit: bei vielen Benutzerdaten könnte man erst alle Zeilen aus der Datenbank abfragen, bei denen der erste Buchstabe des Benutzernamens mit dem ersten Buchstaben des eingegebenen Benutzernamens übereinstimmt - in einer Schleife dann einfach überprüfen, ob die Kombination aus Username und Passwort korrekt ist.
 
Zuletzt bearbeitet:
Ohne Zeichenbeschränkung könnte man eventuell einen Buffer Overflow erreichen

Na ja, das war sicher nicht so gemeint, Passwörter von 50 MB zuzulassen. ;)

ich persönlich würde mit substr eine bestimmte Anzahl an Zeichen des Benutzernamens und des Passworts abschneiden

Da finde ich eine Eingabe wie „Bitte beschränken Sie sich auf 255 (oder 1024 oder …) Zeichen“ sinnvoller. Ansonsten denkt der Nutzer, er hätte ein 2048-Zeichen-Passwort, obwohl es intern „nur“ 255 sind.

bei vielen Benutzerdaten könnte man erst alle Zeilen aus der Datenbank abfragen, bei denen der erste Buchstabe des Benutzernamens mit dem ersten Buchstaben des eingegebenen Benutzernamens übereinstimmt - in einer Schleife dann einfach überprüfen, ob die Kombination aus Username und Passwort korrekt ist.

WHERE username = $username AND password_hash = $password_hash tut es nicht?
 
Nicht, wenn du einen Index auf mindestens eine der Spalten setzt. (Das ist bei Spalten im WHERE-Clause immer zu empfehlen.)
 
Ich frag gleich hier bevor ich noch nen thread aufmache ..



Also will was in meine DB eintragen, funktioniert auch aber es wird falsch eingetragen :(

Hier meine Form:

PHP:
<?php

//Formular zur Dateneingabe
echo'<h3>Daten eintragen</h3>

<form method="post" action="order_end.php">
  Username: <input type="text" name="username" size="30"><br>
 Passwort: <input type="password" name="pass" size="30"><br>
  Email: <input type="text" name="email" size="30"><br>
  <input type="submit" value="Eintragen!">
</form>';

?>

Hier die order_end.php

PHP:
<?php
//Variablen zuweisen
$username = $_POST["username"];
$pass = $_POST["pass"];
$email = $_POST["email"];

if (($username == "") OR ($pass == "") OR($email == "")) {
        echo "Fehler: Eintrag unvollständig.";
        die; 
}

//Verbindung herstellen
$datenbank = mysql_connect("localhost","xxx","xxx") or die ("Verbindung fehlgeschlagen: ".mysql_error());
$verbunden = mysql_select_db("xxx") or die ("Datenbank nicht gefunden oder fehlerhaft");

//Daten in DB speichern
$sql_befehl = mysql_query("INSERT INTO xxx (id,username,pass,email) VALUES ('".$_POST['id']."','".$_POST['username']."','".$_POST['pass']."','".$_POST['email']."')");

if($sql_befehl)
{ echo "Ihr Eintrag wurde hinzugefügt."; }

//Verbindung beenden
mysql_close($datenbank); 
?>

Problem ist das weder die ID noch der Username eingetragen wird :(

tttttt.PNG
 
Zuerst übergibst du 3 Variablen den Inhalt der 3 Felder - dann greifst du erst wieder auf das Superglobale $_POST Array zurück!? Zudem vergisst du zu escapen - eine alternative wären prepared statements, falls dir die lieber sind.

Gib der Spalte id in deiner Benutzer-Tabelle das Attribut AI - anschließend formst Du dein SQL-Statement in...

PHP:
$sql = "INSERT INTO xxx (username,pass,email) VALUES ('".mysql_real_escape_string($_POST['username'])."','".mysql_real_escape_string($_POST['pass'])."','".mysql_real_escape_string($_POST['email'])."'"

...um.

Der Username sollte aber eigentlich übermittelt werden. Welchen Datentyp verwendest Du für die username-Spalte?
 
Zurück
Oben