Her får du hjelp til å lage hjemmeside med video. Alle verktøy og programmer vi bruker til å lage webside er gratis.
Bytte passord og glemt passord-funksjon
- Logg på eller opprett en konto for å skrive kommentarer
Har gjort ett forsøk på å sette opp ett bytte passord script her. Men får opp denne feilmeldingen: Wrong parameter count for mysql_query() - on line 13.
<?php
if (empty($_POST['old_pw']) || empty($_POST['new_pw'])) {
header("Location:/ekemember/din-profil/no-input.php");
} elseif (($_POST['old_pw']) != ($_POST['new_pw'])) {
header("Location:/ekemember/din-profil/not-same.php");
} else {
require ('/path/to/access-db-file.php');
if(!$eke_connection) { die('Beklager - En feil har oppstått - Prøv igjen senere eller ta kontakt: ' . mysql_error()); }
mysql_query('
UPDATE member_info
SET member_pw = \'%s\'
WHERE member_id = \'%d\'',
mysql_real_escape_string($_POST['new_pw']),
mysql_real_escape_string($data['member_id'])); -> (line 13)
mysql_close($eke_connection);
}
?>Hva er det som ikke stemmer?
Må først si at jeg skjønner litt hvorfor du har problemer med å lese din egen kode. Si meg, er du redd for luft i scriptene dine? :P Uansett, jeg omformaterte dem litt, slik at de skal være enklere å lese.
I det første innlegget ditt bruker du ikke sprintf(), slik du skal gjøre. Fiks det, se evt. til andre velfungerende spørringer du har for å sjekke hvordan syntax er. Regner også med at det er deg som har lagt til "-> (line 13)" i scriptet selv.
Ja, bruk brukerID (fra session) og (det gamle) passordet for å se om vedkommende har skrevet inn korrekt gammelt passord.
Jeg har kommet så langt... Men får bare beskjeden "Vi kunne ikke sende deg passordet". Hvor gjør jeg feil?
<?php
if ($_POST) {
// Henter inn data for oppkobling mot mySQL
require('/path/to/db-access-data.php');
$user_mail = mysql_real_escape_string($_POST['my_email']);
// Samler inn data
$select = sprintf("SELECT member_pw FROM member_info WHERE member_email = '$user_mail'");
// Setter opp en spørring til mySQL
$query = mysql_query($select, $eke_connection);
// Hvis inndata finnes i mySQL, basert på kun en rad.
if (mysql_num_rows($query) == 1) {
$data = mysql_fetch_array($query);
$password = $data['member_pw'];
// Mail instillinger
$to = $user_mail;
$subject = "Her er ditt passord";
$header = "Ekaas Kile <support@ekbedriften.no>";
// Mail innhold
$messages = "Ditt passord for å logge inn på ekbedriften.no \r\n";
$messages = "Ditt passord er $password \r\n";
$messages = "Logg inn til Ekaas Kile \r\n";
// Sende mail
$sent_mail = mail($to, $subject, $messages, $header);
} else {
echo "Vi fant ikke den oppgitte eposten i vår database<br />";
}
// Suksessfull sending
if ($sentmail) { echo "Passordet er sendt til din e-post."; }
else { echo "Vi kunne ikke sende deg passordet"; }
} // END: if($_POST)
// > hvis INNDATA ikke blir funnet i FORM
else { print 'Du har ikke fyllt ut feltene tilstrekkelig'); }
?>EDIT!: Fant feilen
under // siksessfull sendig hadde jeg skrevet feil variabel...
Fikk beskjed om at den ble sendt hvertfall... får se om det kommer noe..
EDIT2: Det skjedde ikke...
Lag et skript som kun kjører mail-funksjonen til din epost, type;
<?php
## Set variables
$to = 'blabla@mail.com';
## Send mail
mail($to, $subject, $message, $headers);
?>Sett opp scriptet så det sender en epost til deg selv og kjør det fra webserveren. Sjekk så om du mottar mailen (husk å sjekke i spamfolder).
Prøv også å hente $to (altså mailen) fra queryen, på den måten er ikke mailen satt med mysql_real_escape_string().
Fikk det ikke til, fikk ikke noen e-post...
Men har satt opp en midlertidlig løsning, som gir brukeren passordet rett på skjermen ved riktig kombinasjon av inndata...
Har laget 2 dokumenter (rapport.php og getpw_validate.php).
getpw_validate.php
<?php
// Sjekker at feltene ikke er tomme
if (empty($_POST['my_id']) || empty($_POST['my_ename']) || empty($_POST['my_mail']) || empty($_POST['comfirm_my_mail'])) {
// Setter output i variabel
$if_empty = 'Feltene er ikke tilstrekkelig utfyllt';
}
// Sjekker at innholdet i e-post feltene er identisk
elseif (($_POST['my_mail']) != ($_POST['comfirm_my_mail'])) {
// Setter output i variabel
$elseif = 'E-postene samsvarer ikke med hverandre';
}
// Ved gyldig innput
else {
// Henter inn data for oppkobling mot mySQL
require('/path/to/db-access-data.php');
// Setter input fra form i variabler
$user_id = mysql_real_escape_string($_POST['my_id']);
$user_ename = mysql_real_escape_string($_POST['my_ename']);
$user_email = mysql_real_escape_string($_POST['my_mail']);
$user_comfirm_email = mysql_real_escape_string($_POST['comfirm_my_mail']);
// Samler data til en spørring mot mySQL
$select = sprintf("SELECT member_pw FROM member_info
WHERE member_id = '$user_id'
AND member_lname = '$user_ename'
AND member_email = '$user_email'");
// Setter opp en spørring til mySQL
$query = mysql_query($select, $eke_connection);
// Hvis inndata finnes i mySQL, basert på kun en rad.
if(mysql_num_rows($query) == 1) {
// Setter hentet data i en variabel
$data = mysql_fetch_array($query);
// Setter output i en variabel
$else = 'Vi har registrert <strong>' . $data['member_pw'] . '</strong> som ditt passord';
}
// Hvis inndata ikke finnes i mySQL
else {
// Setter output i en variabel
$none = 'Vi kunne ikke finne deg i vår database basert på informasjonen du registrerte.';
}
}
?>rapport.php
Helt i toppen av dokumentet har jeg satt:
<?php require '/path/to/getpw_validate.php' ?>
Så har jeg listet opp alle outputs-variablene, rett etterhverandre.
Hadde håpet du kunne gitt meg litt hjelp så jeg kan få til å sende passordet til den registrerte eposten.
Først og fremst, du bruker sprintf()-funksjonen feil... Syntax er som jeg har vist tidligere slik;
<?php
$str = sprintf('SELECT * FROM foo WHERE bar = \'%s\'',
$bar);
?>så i oppsettet mitt ovenfor så trenger jeg ganske enkelt ikke benytte meg av sprint()?
Jo, det synes jeg du skal på alle queryer med usikrede variabler. Det er ett av mange viktige sikkerhetstiltak mot SQL-injections.
så jeg bør ikke sette mysql_real_escape_string(); i variabler da?
Jo, så absolutt, det er også et sikkerhetstiltak for å unngå SQL-injeksjoner.
den er good... nå er det bursdag til nevøen, så for se om jeg klarer å få vridd hode rundt det å få sendt e-post via php i kveld...
Hadde vert greit å fått den i stand fremfor løsningen jeg har akkurat nå...
Jeg laget ett nytt dokument med KUN følgende:
<?php
// variabler
$to = 'thomas.kile@hotmail.com';
$subject = 'Tester';
$message = 'Kjører en test - test nr. 1';
$headers = 'Thomas Kile <thomas.kile@ekbedriften.no>';
// send mail
mail($to, $subject, $message, $headers);
?>
Lastet dokumentet opp på serveren og gikk direkte til siden...
Da skulle man vel aktivere scriptet og få tilsendt en mail?
EDIT: Har ikke satt opp noen mail hos bluehost da. kun hos domeneshop. Det har kansje noe å si?
Du skal ikke trenge å sette opp noe mail for å sende epost med PHP. Du kan sende fra obama@usa.gov om du vil. E-post er en gammel og dårlig teknologi, og derfor går det.
Jeg modifiserte scriptet ditt litt og kjørte det på mitt webhotell, da mot min GMail-adresse og det fungerte ypperlig. Sjekket du spamfolderen på Hotmailadressen etter du kjørte scriptet?
Her er min modifisering. Prøv det og se om du får epost slik du skal. Husk å sjekke spamfolder!
<?php
error_reporting(E_ALL);
// Variables
$to = 'EPOST@TIL.NOEN';
$subject = 'Tester';
$message = 'Kjører en test - test nr. 1';
$headers = 'From: Thomas Kile <thomas.kile@ekbedriften.no>' . "\r\n" .
'Reply-To: thomas.kile@ekbedriften.no' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// send mail
if(mail($to, $subject, $message, $headers)) {
print 'Successfully sent';
} else {
print 'Some error occured, no mail was sent.';
}
?>Husk å legge inn din adresse som mottaker da.
Og du! Tusen hjertlig takk for donasjonen, Thomas. Satt veldig pris på den altså! (Pengene skal gå til PowerSupply).
okay, bruker MAIL (mac-program) til å lese eposten og ikke via nettleser (hotmail). Så hadde fått 27 mail da. i søppelposten... Har ikke vert inne på den på flere måneder. Så funksjonen ser ut til å fungere...
Men ett problem. Mailen kom fra ekbedrif@box691.bluehost.com. Vil jo gjerne at den skal bli sendt fra min. Eksempel support@ekbedriften.no, eller thomas.kile@ekbedriften.no.
Du sa man kunne få sendt den fra hva som helst?
forresten. bare hyggelig det med donasjonen. Du har vert den abolutt avgjørende faktoren for fremgangen i web-utviklingen min. Var vansklig å avgjøre hvor mye eller lite i og med at det ikke var noe alternativ... Men alt kommer vel godt med regner jeg med...
Du hadde satt opp gale headers, og det var derfor mailen kom fra den adressen. Prøv mitt script, så ser du at din egen ekbbedriften-epost blir avsenderen din. :)
Ja, den generøse donasjonen fra deg kommer veldig godt med. Skal se om jeg kan finne en PSU på ebay til uka. :) Next up da blir noen disker i tilfellet diskhavari.
nei, kjørte ett nytt forsøk, med ditt script. Men kom fra samme avsender: ekbedrif@box691.bluehost.com
Jeg kjører samme script og det fungerer glimrende. Det er ikke noen tidligere mailer som er sendt med det gamle scriptet som siger gjennom da?
Skriv inn en ny $message i mitt script, slik at du ser forskjell på mailer sendt med ditt og mitt script. Si så ifra om den fortsatt sender med ekbedrif@box691.bluehost.com som avsender.
prøvde på det, for å være sikker på at det var en helt fresh mail jeg fikk... Men avsender er fortsatt ekbedrif@box691.bluehost.com
Kjør akkurat dette scriptet da:
<?php
error_reporting(E_ALL);
// Variables
$to = 'mr.henrik@gmail.com';
$subject = 'Sender en epost';
$message = 'Dette er en test fra ThomasK.';
$headers = 'From: Thomas Kile <thomas.kile@ekbedriften.no>' . "\r\n" .
'Reply-To: thomas.kile@ekbedriften.no' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// send mail
if(mail($to, $subject, $message, $headers)) {
print 'Successfully sent';
} else {
print 'Some error occured, no mail was sent.';
}
?>Det skal sende meg en mail fra din mail, så får vi sjå.
Har nå mottatt epost fra deg, den kom slik du sier:

Jeg synes dette er ekstremt rart, for når jeg kjører eksakt samme script fra mitt webhotell hos Bluehost, så får jeg;

Prøv å endre avsenderadresse til noe annet enn domenet ditt, f.eks. "mannen@totito.no". Kanskje det går ann å sette din epost fra mitt webhotell, siden jeg sender fra mitt domene og ikke ditt.
Det kan hende Bluehost har lagt inn noe sikkerhet her, jeg er usikker. Prøv å se om du får en annen avsender når du definerer en epost som ikke hører til det domenet du kjører scriptet fra.
nå har jeg testet en del da. Og det ser jammen meg ut som at jeg ikke kan sende fra min egen domene endelse.
Hva kan det komme av?
FANTASTISK! chatten hos bluehost er under "maintance"....
Det var et wild guess fra min side, og et rimelig patetisk forsøk på å sikre autentisk epost fra Bluehost sin side, synes jeg.
Vet ikke sikkert, men dette kan ha sammenheng med at domenet ditt har DNS hos Domeneshop og kun er pekt til Bluehost.
Var jeg deg ville jeg byttet DNS til Bluehost (bla deg ned til "Endre navnetjenere hos Domeneshop"), slik at de tar seg av alt. (Mao, ikke bare peke domenet, slik jeg vet at du gjør nå). Nå betaler du vel kr. 90 per år for at Domeneshop skal ta seg av mailen din, dette gjør Bluehost gratis for deg.
Gjør dette, vent på at DNS er oppdatert og prøv igjen. PS: Endring av DNS kan ta sin tid. Løs andre problemer i mellomtiden.
sant. vet. men var litt sent ute med å avbestille mailtjenesten hos domeneshop. så ble sittende med den...
Sånn, da endret jeg bare navntjenerene og DNS peker fanen forsvant... fikk beskjed om at endringene ble sendt til NORID eller den der...
Hva skjer nå egentlig?
bortsett fra at .no domenet mitt nå kan gjøres noe med i cPanel hos bluehost?
Vil det ta noe tid før dette trer i kraft kansje? Fikk en epost fra domeneshop om noe endringer.
Kjørte en ny test, men fortsatt fra avsender: bluehost.com
Nestegang du får faktura fra domeneshop på mail, så sier du at du ikke skal ha mailtjenesten lenger. Da sender de deg en ny invoice hvor du kun faktureres for domenet.
Tidligere når du har gått inn på domenet ditt, så har en forespørsel blitt sendt til Domeneshop sine DNS. Disse har sagt at domen.com og www.domene.com er pekt mot den delte IP-adressen du bruker hos Bluehost.
Nå blir det slik at de som går inn på domenet ditt spør DNS hos Bluehost, ikke Domeneshop.
Det gir deg enklere tilgang selvsfølgelig, siden ting kun trenger å endres hos 1 host, f.eks. hvis du skal sette opp subdomener som blogg.domene.com el.l. I tillegg vil ting gå litt fortere siden alt gjøres hos Bluehost.
Si ifra om denne endringen gjorde at mailen gikk gjennom da. Si også ifra om den fortsatt havner i spam eller ei. (Dette kan ha med rDNS å gjøre), men mer om det når alt er oppdatert.
den er god. Venter en stund da ting tar litt tid for .no domener...
men, snakker vi minutter eller timer?... gidder ikke sitte å klikke "refresh" hvert 5'te minutt...
Det kan ta en god stund med no-domener. Har hørt opplevd timer og et par dager. Mener du får epost fra NORID (til mailen du skrev inn da du kjøpte domenet) når de har foretatt endringene, så du slipper å sitte å refreshe, hehe.
Som jeg sa; løs heller noen andre problemer i mellomtiden. :)
har det noe med type nettleser når det kommer til om mailen havner i søppelpost eller ikke?
Testet nettopp siden i SAFARI og da fikk jeg mailen rett i innboksen. Bruker jeg Firefox så havner den i søppla...
Glem det... trur jeg... virker som hele shiten lever sitt eget liv... Noen ganger så er avsender bluehost.com, andre ganger den oppgitte eposten. Noen ganger havner e-posten i søppelpost og andre ganger rett i innboksen... er jo til å bli GAL av!!! Hehee... nei nå er det en godt dusj og i seng...
Snakker du da om hvilken nettleser du bruker når du caller scriptet, eller når du sjekker mailen hos Hotmail?
Bruk av nettleser skal, såvidt meg bekjent, ikke ha betydning for hvordan mail håndteres av mailserver på webhotell eller tredjeparts mailservere (i dette tilfellet Hotmails servere).
Mail merkes som spam pga rDNS
Det som gjerne er problemet er såkalt rDNS. Nå har ikke jeg sjekket headerne på mailene i sin helhet, men den vanligste grunnen til at mail havner i spam er fordi rDNS ikke er konfigurert riktig. Ikke tenk så mye på det enda, det første som må til her er at du får sendt med din egen epost som avsender.
Si du hadde satt opp en mailserver hjemme da. Så bruker du denne til å sende en epost til en eller annen hotmail adresse.
Det som skjer da er at mailserveren din sier "Jeg sender mail fra domenet mail.domene.com". Hotmail sin server ser denne beskjeden, samt. IPen hvor mailserveren står. Deretter slår Hotmail opp IPen din, og ser at den ikke peker til "mail.domene.com" slik mailserveren din hevder. I et sånt tilfelle vil Hotmail kjapt merke eposten som spam.
Det er ikke deg som styrer hva rDNS skal være. Det er det "eieren" av IPen som bestemmer. F.eks. er hosten til din IP noe sånt som "customer14-2933-telenor.no" elns, ikke mail.domene.com.
Men uansett - ikke heng deg opp i dette nå. Løs én ting av gangen og vent til DNS er i orden først. Sjekket nettopp nameserverne dine, og de er ikke oppdatert enda. Du kan sjekke dette hos NORID med en enkel ZoneCheck på dittdomene.no.
svarer bare kjappt før jeg leger meg, uten å lest gjennom alt. lese gjennom i morgen tidlig...
Snakker om når jeg caller scriptet...
Ville bare si at jeg nettopp sjekket linken du skrev (NORID med en enkel ZoneCheck), og nå var jeg registrert på bluehost... Kjørt ett par mailtester med fortsatt "feil". Altså, avsender er bluehost.com
Ok, prøv å opprette en epost som er identisk til den du sender fra da, mulig det vil fungere.
Når du har laget epostadressen sender du først en mail fra hotmail til mailadressen og fra mailadressen til hotmail. På den måten ser du om eposten både sender og mottar epost.
Hvis det fungerer så kjører du igjen scriptet ditt for å se hvorvidt det fungerer.
da har jeg testen en god del. Og det ser nå ut som det hele skal fungere...
har satt opp de aktuelle epost adressene jeg ønsker å benytte meg av i første omgang.
Før jeg går videre på glemt passord-biten ønsker jeg å kryptere passordet etc. forsøkte litt md5(); - men det fikk jeg ikke til å fungere helt riktig... så starter en ny tråd rundt dette før jeg går videre...
Fikk du sendt fra mail fra PHP med din epost etter du opprettet en epostkonto for den aktuelle e-postadressen?
Greit å vite for egen del, og eventuelt dersom andre møter samme problemstilling.
Ja, fikk avsenderen til å bli den oppgitte ja. Med PHP-scriptet. ... litt av ett styr for en såpass smal sak...
Eneste at posten havner rett i søppla da. noe som er noe tungvindt med tanke på at MAIL på Mac ikke henter post fra søppla... Den sjekker posten som kommer i innboksen og avgjør om det innholdet er "uønsket" eller ikke...
Men, for å få dette til, så er man nødt til å opprette en mail-konto hos bluehost. OG, om man har en mail-konto hos domeneshop, så må denne slettes også...




Ville bare legge til at dette fungerer helt flott da...
<?phpif (empty($_POST['old_pw']) || empty($_POST['new_pw'])) {
header("Location:/ekemember/din-profil/no-input.php");
} elseif (($_POST['old_pw']) != ($_POST['new_pw'])) {
header("Location:/ekemember/din-profil/not-same.php");
} else {
require ('/path/to/access-db-file.php');
if(!$eke_connection) {
die('Beklager - En feil har oppstått - Prøv igjen senere eller ta kontakt: ' . mysql_error());
}
mysql_query("
UPDATE member_info
SET member_pw = '$_POST[new_pw]'
WHERE member_id = '$data[member_id]'");
mysql_close($eke_connection);
}
?>
Vil også legge til at jeg glemte hovedintensjonen min.
Jeg ville at brukeren skulle legge inn gammelt passord for validering/godkjenning av endring. Men endte opp med å sjekke att begge feltene hadde likt innhold.
Skal se om jeg får den på plass også.
EDIT: Fikk ikke det til helt. har på følelsen av at jeg må lage en spørring til databasen om gammelt passord og sjekke om de stemmer overens med inputten til brukeren.
med hilsen
Thomas Kile