Avatar billede trajkovski Nybegynder
30. december 2004 - 00:11 Der er 16 kommentarer og
1 løsning

Opdater database problem

Hej

Jeg har fundet et gammelt script frem, der kunne opdatere en brugers oplysninger i et brugersystem, sådan at brugeren var i stand til at rette f.eks. sin email.

Det virkede dengang, men der er noget fuldstændig galt nu :(

Scriptet i sin fulde længde:
"
<?
session_start();
//header("Cache-control: private"); //IE 6 Fix
if(!$_SESSION['brugernavn']){
$msg = "Log ind nedenfor";
header("Location: index.php?msg=".$msg);
exit();
}

require("../billeder/mysql/mysql-funktioner.php");

$posted_brugernavn = $_POST['brugernavn'];
$posted_password = $_POST['password'];
$posted_password2 = $_POST['password2'];
$posted_fornavn = $_POST['fornavn'];
$posted_mellemnavn = $_POST['mellemnavn'];
$posted_efternavn = $_POST['efternavn'];
$posted_email = $_POST['email'];
$posted_klasse = $_POST['klasse'];
$posted_gruppe = $_POST['gruppe'];
$posted_tlfnr = $_POST['tlfnr'];
$posted_andet = $_POST['andet'];
$posted_first_login = $_POST['first_login'];

$posted_brugernavn = stripslashes($posted_brugernavn);
$posted_password = stripslashes($posted_password);
$posted_password2 = stripslashes($posted_password2);
$posted_fornavn = stripslashes($posted_fornavn);
$posted_mellemnavn = stripslashes($posted_mellemnavn);
$posted_efternavn = stripslashes($posted_efternavn);
$posted_email = stripslashes($posted_email);
$posted_klasse = stripslashes($posted_klasse);
$posted_gruppe = stripslashes($posted_gruppe);
$posted_tlfnr = stripslashes($posted_tlfnr);
$posted_andet = stripslashes($posted_andet);

$posted_password = md5($posted_password);
$posted_password2 = md5($posted_password2);

$posted_tlfnr = str_replace(' ', '', $posted_tlfnr);

$denne_bruger = $_SESSION['brugernavn'];
$userid = $_SESSION['userid'];

if(!$posted_fornavn || !$posted_efternavn || !$posted_email || !$posted_klasse || !$posted_gruppe || !$posted_tlfnr){
$msg2 = "Du har ikke udfyldt alle felterne markeret med *!";
header("Location: index.php?vis=ret_data&msg2=".$msg2);
exit();
}

if($posted_password != $posted_password2){
$msg2 = "Dine indtastede passwords var ikke ens - prøv igen.";
header("Location: index.php?vis=ret_data&msg2=".$msg2);
exit();
}

aabn_forbindelse_og_vaelgdb();
$sql = mysql_query("SELECT * FROM brugere WHERE brugernavn='$denne_bruger' AND userid='$userid'");

while($row = mysql_fetch_array($sql)){
    foreach( $row AS $key => $val ){
        $$key = stripslashes( $val );
        }
    }

/*switch($val[]){
    case "$val[] != $".posted_."val":
    $val = $".posted_."val";
    break;
}*/

if($posted_brugernavn != $brugernavn){
$brugernavn = $posted_brugernavn;
}

if($posted_password != $password && !empty($posted_password)){
$password = $posted_password;
}

if($posted_fornavn != $fornavn){
$fornavn = $posted_fornavn;
}

if($posted_mellemnavn != $mellemnavn){
$mellemnavn = $posted_mellemnavn;
}

if($posted_efternavn != $efternavn){
$efternavn = $posted_efternavn;
}

if($posted_email != $email){
$email = $posted_email;
}

if($posted_klasse != $klasse){
$klasse = $posted_klasse;
}

if($posted_gruppe != $gruppe){
$gruppe = $posted_gruppe;
}

if($posted_tlfnr != $tlfnr){
$tlfnr = $posted_tlfnr;
}

if($posted_andet != $andet){
$andet = $posted_andet;
}

$sql2 = mysql_query("UPDATE brugere SET brugernavn='$brugernavn', fornavn='$fornavn', mellemnavn='$mellemnavn', efternavn='$efternavn', password='$password', email='$email', klasse='$klasse', gruppe='$gruppe', tlfnr='$tlfnr', andet='$andet', first_login='0' WHERE userid='$userid'");
luk_forbindelse();

if($sql2 && $_SESSION['first_login'] == 1){
$msg2 = "Dine data er blevet opdateret - mange tak for hjælpen!<br \>Du kan nu benytte systemet som du lyster!";
//header("Location: index.php?vis=giv_besked&msg2=".$msg2);
$_SESSION['first_login'] = "0";
$_SESSION['brugernavn'] = $brugernavn;
$_SESSION['fornavn'] = $fornavn;
$_SESSION['email'] = $email;
$_SESSION['user_level'] = $user_level;
$_SESSION['userid'] = $userid;
echo $msg2;
exit();
} elseif ($sql2){
$msg2 = "Dine data er blevet opdateret!";
//header("Location: index.php?vis=giv_besked&msg2=".$msg2);
$_SESSION['brugernavn'] = $brugernavn;
$_SESSION['fornavn'] = $fornavn;
$_SESSION['email'] = $email;
$_SESSION['user_level'] = $user_level;
$_SESSION['userid'] = $userid;
$_SESSION['first_login'] = $first_login;
echo $msg2;
echo "brugernavn='$brugernavn', fornavn='$fornavn', mellemnavn='$mellemnavn', efternavn='$efternavn', password='$password', email='$email', klasse='$klasse', gruppe='$gruppe', tlfnr='$tlfnr', andet='$andet', first_login='0', userid='$userid'";
exit();
} else {
$msg2 = "Der skete en fejl da databasen skulle opdateres.<br \>Prøv igen."; /* - en admin er blevet underrettet.*/
header("Location: index.php?vis=ret_data&msg2=".$msg2);
exit();
}
?>
"

Som I kan se, har jeg bedt den om at udskrive de variabler den skal opdatere databasen med, og de er korrekte, men databasen bliver simpelthen ikke opdateret! Om jeg begriber hvorfor...

Hvis I kan forstå det må i meget gerne give en hjælpende hånd :)

Med venlig hilsen

Nicolai
Avatar billede erikjacobsen Ekspert
30. december 2004 - 00:24 #1
Skal du ikke bruge $posted_brugernavn i stedet for $brugernavn i din SQL-sætning?
Avatar billede erikjacobsen Ekspert
30. december 2004 - 00:25 #2
Jeg mener: det er overflødigt at lave de tests for om værdien er der allerede.
Avatar billede erikjacobsen Ekspert
30. december 2004 - 00:28 #3
Og så skal du iøvrigt se hvad den siger til dig:

$sql2 = mysql_query("UPDATE brugere .... WHERE userid='$userid'") or die(mysql_error());
Avatar billede trajkovski Nybegynder
30. december 2004 - 01:14 #4
Hmmm... Ja du har måske ret i, at de tests er overflødige...

Noget andet er at nu har jeg smidt siden op med din lille tilføjelse til $sql2, men nu kan jeg ikke engang logge ind, for så siger den at brugernavnet ikke findes, og jeg kan heller ikke få den til at sende mig et nyt pass, for så siger den
"Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 8 in /hsphere/local/home/sagshow/sagshow.dk/design/send_pass.php on line 32.

Warning: Cannot modify header information - headers already sent by (output started at /hsphere/local/home/sagshow/sagshow.dk/design/index.php:12) in /hsphere/local/home/sagshow/sagshow.dk/design/send_pass.php on line 56"." Det, at jeg ikke kan logge ind eller få et nyt pass, er først lige sket nu - jeg fatter ikke hvorfor...

Det hele har ellers virket tidligere i dag... Måske skulle jeg bare gå i seng og håbe på bedre tider i morgen :(
Avatar billede trajkovski Nybegynder
30. december 2004 - 01:17 #5
Hmmm... Den vil godt sende et nyt pass til en anden bruger, men når jeg logger ind med det brugernavn, siger den bare at det ikke findes...

Det er da mærkeligt!
Avatar billede erikjacobsen Ekspert
30. december 2004 - 09:07 #6
Nej, ikke mærkeligt - der er bare en fejl.

Du tror vel ikke at det script, du har vist her indsætter en ny bruger?
Avatar billede trajkovski Nybegynder
31. december 2004 - 00:59 #7
Nej det gør det ikke... Det skulle det i hvert fald ikke og det gjorde det heller ikke engang...
Avatar billede trajkovski Nybegynder
31. december 2004 - 01:39 #8
Jeg forstår det ikke... Nå lad os starte i det små... nu får du lige glemt password siden som melder følgende fejl:
"
Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 8 in /hsphere/local/home/sagshow/sagshow.dk/design/send_pass.php on line 32
"

glemtpass:
"
<?
require("../billeder/mysql/mysql-funktioner.php");

function makeRandomPassword() {
  $salt = "abchefghjkmnpqrstuvwxyz0123456789";
  srand((double)microtime()*1000000);
      $i = 0;
      while ($i <= 7) {
            $num = rand() % 33;
            $tmp = substr($salt, $num, 1);
            $pass = $pass . $tmp;
            $i++;
      }
      return $pass;
}

$email = $_POST['email'];

if(empty($email)){
$msg2 = "Indtast din email nedenfor!";
header("Location: index.php?vis=glemt_pass&msg2=".$msg2);
exit();
}

$random_password = makeRandomPassword();

$nyt_password = md5($random_password);

aabn_forbindelse_og_vaelgdb();
$findes = mysql_query("SELECT * FROM brugere WHERE email='$email'") or die(mysql_error());
$sql = mysql_query("UPDATE brugere SET password='$nyt_password' WHERE email='$email'") or die(mysql_error());
DETTE ER LINIE 32: $fornavn = mysql_result(mysql_query("SELECT fornavn FROM brugere WHERE email='$email'"),0) or die(mysql_error());
luk_forbindelse();

if(mysql_num_rows($findes) > 0){

$emne = "Password";
$besked = "Hej $fornavn
Dit nye password er: $random_password

Du kan logge ind her: http://www.x.dk/

Med venlig hilsen

Hjemmeside Teamet  (hpt@x.dk)";

if($sql){
mail($email, $emne, $besked,
        "From: Hjemmeside Teamet<hpt@x.dk>\n
        X-Mailer: PHP/" . phpversion());
    echo "Et nyt password er blevet sendt til $email\n\n Tjek din mail for yderligere anvisninger.";
exit();
    }
} else {
$msg2 = "Emailen kunne ikke findes i databasen!";
header("Location: index.php?vis=glemt_pass".$msg2);
}
?>
"

Godt nytår og tak for at du gider at hjælpe! :)
Avatar billede erikjacobsen Ekspert
31. december 2004 - 09:39 #9
Du må ikke sige luk_forbindelse(); før du er færdig med at bruge alle data fra dine forespørgsler.
Avatar billede trajkovski Nybegynder
01. januar 2005 - 23:32 #10
Ok... Men nu har jeg prøvet at rykke luk_forbindelse(); ned, sådan at der tilsidst stod:
if($sql){
mail($email, $emne, $besked,
        "From: Hjemmeside Teamet<hpt@x.dk>\n
        X-Mailer: PHP/" . phpversion());
    echo "Et nyt password er blevet sendt til $email\n\n Tjek din mail for yderligere anvisninger.";
luk_forbindelse();
exit();
    }
} else {
luk_forbindelse();
$msg2 = "Emailen kunne ikke findes i databasen!";
header("Location: index.php?vis=glemt_pass".$msg2);
}

og det hjalp ikke... Den meldte stadig samme fejl.

Dette sker også, hvis jeg helt fjerner luk_forbindelse(); fra siden.
Avatar billede erikjacobsen Ekspert
01. januar 2005 - 23:39 #11
Det var så een ting. Men du kan ikke lave
$fornavn = mysql_result(mysql_query("SELECT fornavn FROM brugere WHERE email='$email'"),0) or die(mysql_error());
førend du ved om der er een med den email, så flyt den ind i if-sætningen nedenunder.
Avatar billede trajkovski Nybegynder
02. januar 2005 - 01:07 #12
Ok... Du kan have en pointe der ;) Men jeg forstår ikke at det har virket før i tiden - gør du det?

Nå men nu har jeg rykket det ind i if-sætningen, så der står:
if(mysql_num_rows($findes) > 0){
$fornavn = mysql_result(mysql_query("SELECT fornavn FROM brugere WHERE email='$email'"),0) or die(mysql_error());

$emne = "Password";
$besked = "Hej $fornavn
osv.

Nu kommer den så med følgende fejl:
Warning: Cannot modify header information - headers already sent by (output started at /hsphere/local/home/sagshow/sagshow.dk/design/index.php:12) in /hsphere/local/home/sagshow/sagshow.dk/design/send_pass.php on line 55

Dvs. den mener at det her matcher tilfældet:
else {
$msg2 = "Emailen kunne ikke findes i databasen!";
header("Location: index.php?vis=glemt_pass".$msg2);
}

Men emailen findes i databasen. Det er det, der er så mystisk!

På linie 12 i index.php står følgende:
<META NAME="Description" content="x">

Der er en masse metatags før og efter dette tag. Hører metatags med i headerinformationen?

Noget andet er at jeg har fundet ud af, at den godt vil sende et password til en bestemt adresse. Det mærkelige er så at jeg har skiftet fornavn til denne mail mange gange, men den bliver ved med at skrive det samme fornavn i mailen.
Eks.: den skriver "Hej Stunt Dit nye password er...", hvor fornavnet til denne mail nu er Michael, så den burde skrive "Hej Michael Dit nye password er...".

Endnu engang tak for at du gider bruge din tid på mig! :)
Avatar billede erikjacobsen Ekspert
02. januar 2005 - 08:45 #13
Så er det jo fordi den ikke findes, den email. Prøv at skriv værdien af $email ud.
Intet HTML, meta, head, body, tomme linier hører med til en HTTP-header, så skriv
ingenting ud, hvis du alligevel vil lave en redirect. Der er jo alligevel ingen der
ser det ;)
Avatar billede trajkovski Nybegynder
08. januar 2005 - 23:16 #14
Hej Erik

Jeg har fundet ud af at løse problemet selv. Det var pga. at den side med databaseoplysningerne indeholdt nogle forkerte oplysninger, så scriptet snakkede med en anden database.

Så er det man spørger sig selv: Hvor dum kan man være?! :)

Hvis du poster et svar, vil jeg meget gerne give dig pointene, da jeg synes du har været vældig flink og hjælpsom til den bitre ende :)

Forresten hvis du finder flere "småfejl", må du meget gerne komme med dem, for så vil jeg skynde mig at rette dem.

Med venlig hilsen

Nicolai
Avatar billede erikjacobsen Ekspert
08. januar 2005 - 23:18 #15
Jeg samler ikke på point, tak.
Avatar billede trajkovski Nybegynder
08. januar 2005 - 23:37 #16
Nå, det var nu ikke sådan ment... Jeg ville bare vise min taknemmelighed :)
Avatar billede trajkovski Nybegynder
09. januar 2005 - 00:22 #17
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester