I alla skript jag försöker använda konstruktionen
if (!$variabel) enligt en bok jag har så uppstår det fel. Antigen blir det parse error eller som i exemplet nedan verkra det som om den hoppar över hela loopen. $pw blir utan värde... Finns det olika syntax i olika versioner av PHP, så att skälet är att jag borde skriva det på ett annat sätt? Har sedan jag startade PHP-programmering aldrig fått den här konstruktionen att funka.
while ($flag=false) {
// hämta lösenord genom att anropa funktionen
$pw = password(8);
$pwresult=mysql_query("select * from TABLE where password='".$pw."'");
if (!$pwresult)
return "Could not execute query";
if (mysql_num_rows($pwresult)>0)
return "That password is taken please try again";
if (mysql_num_rows($pwresult)<0)
// here we are sure the password is unique
// set flag is true to exit loop
$flag=true;
}
ett annat exempel som jag tagit direkt ur en bok, som inte heller funkar...
[redigerat i efterhand: jag tar bort det här andra exemplet för att koncentrera diskussionen till bara ett problem]
Har någon något tips?
MatteMedlem sedan aug. 20002 975 inlägg Får du felmeddelande om "undefined variable" så skriver du istället det mer korrekta:
if (!isset($pwresult))
I din nedre variant så tror jag du istället får använda
empty($pris )
istället. Beroende lite på hur koden i övrigt ser ut.
Får du parseerror så är det syntaxfel.
Tack för hjälpen, men det fungerar ändå inte när det gäller $pw som är det jag jobbar med just nu. Jag har kört sidan utan den här kontrollen som är till för att man inte ska få indentiska lösenord till posterna. Utan kontrollen, dvs loopen, fungerar det som det ska, dvs ett lösenord tas fram genom funktionen password($antaltecken). Men när jag introducerar den här kontrollen resulterar det i att det inte blir något lösenord alls, utan det blir bara ett tomt värde... skumt...
Kanske är det loopen som är felformulerad?
MatteMedlem sedan aug. 20002 975 inlägg Ingår det här i någon funktion? I såfall kanske det ska till någon form av return när password inte är upptaget.
Annars så förstår jag inte det här:
while ($flag=false) {
Finns det någon speciell tanke med att alltid sätta $flag till false eller är det så här du tänkt dig:
while ($flag==false) {
Tja, jag vet inte, hade inte tänkt på det eftersom det var så det stod i det skript jag tog ursprungligen... Med == blev det i varje fall en evighetsloop som avbröts automatiskt efter 30 sekunder...
MatteMedlem sedan aug. 20002 975 inlägg En annan sak jag reagerar över är det här:
if (mysql_num_rows($pwresult)<0)
Hur kan det hittas mindre än 0 (noll) rader? Borde det inte vara:
if (mysql_num_rows($pwresult)==0)
det i kombination med
while ($flag==false) {
Borde väl se till att while-satsen lämnas efter att ett unikt $pw hittats.
Det är svårt att säga när man inte ser helheten.
Samtidigt så kommer ju funktionen att brytas om ett skapat $pw inte är unikt, så vad ska man då ha while-satsen till ?
blir inte klok på koden. :q
Matte, du har många kloka synpunkter. Det är ju nästan löjligt hur rätt du hade och hur blind jag var. Med...
if (mysql_num_rows($pwresult)==0)
...fungerade det hela som fisken i vattnet (salamandern i vattnet?)... :)
Nu fungerar det perfekt. Underbart.
Däremot har du väl inte rätt i att while-loopen avbryts om ett pw inte är unikt eftersom flaggan fortfarande har värdet false i det läget. Om jag tänkt rätt så anropas funktionen password() igen om pw inte är unikt...
men som sagt, du regerar idag! Jättetack! :)
Det är synd att du inte blir klok på koden... Det ligger en funktion som slumpar fram ett password strax innan och sedan om flaggan blir TRUE i loopen fortsätter koden med en insert-query där $pw läggs in i en rad tilsammans med annan info från ett formulär som postats till den här sidan...
Blir sammanhanget tydligare nu?
MatteMedlem sedan aug. 20002 975 inlägg Vad jag menar på att jag inte blir klok på det är att det finns en massa return i koden. return bryter en funktion och skickar resultat. Som jag ser det så måste ju while-satsen ligga inne i en funktion, annars är det ingen mening med return.
Hade det istället sett ut mer så här så hade jag förstått:
function password($tal){
// funktion som skapar lösen ord
}
$flag = false;
while ($flag==false) {
// hämta lösenord genom att anropa funktionen
$pw = password(8);
$pwresult=mysql_query("select * from TABLE where password='".$pw."'")
or die("Could not execute query");
if (mysql_num_rows($pwresult)==0)
// here we are sure the password is unique
// set flag is true to exit loop
$flag=true;
}
// koden fortsätter och gör något med $pw
PS
Salamander är ett groddjur
Ja, du har nog rätt. I första if-satsen är det ju på sin plats eftersom det innebär att någonting inte funkar med databaskopplingen, men i andra fallet har du nog rätt, där bör jag nog plocka bort return. Men jag vet ändå inte riktigt om jag håller med om att loopen borde vara inne i password funktionen.
Som det är nu uppfattar jag det sä här
1. loopa medans flaggan är false
2. ta fram ett password
3. kolla om det finns, om inte -- tummen upp -- sätt flaggan till true så att loopen inte körs igen
om passwordet finns gå tillbaka till 2, dvs ta fram ett passord igen och kolla
...det här fortsätter tills det finns ett unikt pw
Nå? Vad anser du?
MatteMedlem sedan aug. 20002 975 inlägg Menar absolut inte att while-satsen ska vara inne i password-funktionen. Vad jag menade var att om inte while-satsen låg i en funktion (annan funktion än password) så hade return ingen som helst funktion i skriptet, och i såfall får man plocka bort alla return.
Ligger while-satsen inte i en funktion så har if-satsen, som kollar att sql-förfrågan är ok, ingen som helst betydelse (eftersom return inte har någon mening). While-satsen kommer inte att brytas av den.
Däremot om man lägger till or die() efter mysql_query() så kommer skriptet att brytas om det blir något fel på databasförfrågan.
Att skriva while ($flag=false) är samma sak som att skriva while(TRUE) och while-satsen kommer aldrig att brytas (såvida den inte ligger inne i en funktion och man skickar ett return).
$flag=false returnerar alltid true medan
$flag==false returnerar true om $flag är false, och false om flag är true. Det behövs att det returneras false för att while-satsen ska brytas.
Ta en liten titt på det som jag "förstod" i mitt förra inlägg så ser du vad jag menar.
Jajamen, du har helt rätt... :)