Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 18:43 Der er 24 kommentarer og
1 løsning

Problem med while og update i IF-statement

Kære brugere af Eksperten

Nu har jeg nørklet med neddennævnte kode i de sidste 4 timer og kan bare ikke få det til at fungere korrekt.

Jeg har en tabel med Email, Navn, tid og afhængig af variablen $status skal der i de tilfælde, hvor denne er forskellig fra "noget bestemt tekst" foretage en update af tabellen, i form af feltet "tid".

Dér hvor jeg ikke kan få koden til at fungere korrekt, er selve opdateringen idet mit IF-statement ikke udfører en update af samtlige de data, hvor det ellers skulle ske.

Kan nogle give mig en idé om hvad jeg skal ændre?

<?
$Db = mysql_connect("xxxx.net", "YYYY", "PASS");
mysql_select_db("BBBB", $Db);
$result = mysql_query("SELECT * FROM mintabel)",$Db);
while ($myrow = mysql_fetch_array($result))
{
   
echo "<b>".$myrow["Navn"]."</b><br>";
$Navn = $myrow["Navn"];
$status = "noget bestemt tekst";
if ($status != "noget bestemt tekst") {
mysql_query("UPDATE mintabel SET tid=now() WHERE Navn='$Navn'");
mysql_close($Db);
echo 'DB er opdateret ';
}
mysql_close($Db);
}
?>
Avatar billede showsource Seniormester
14. november 2010 - 19:07 #1
Prøv at sætte or die (mysql_error(); på dine query's, så finder du sikkert fejlen.
14. november 2010 - 19:08 #2
Saadan som du har skrevet koden vil der aldrig vaere noget at update.  I din while loekke siger du for hver raekke at $status = 'noget bestemt tekst' og at der skal updates hvis $status er forskellig fra 'noget bestemt tekst'.

Er status en kolonne i tabellen saaledes at du for eksempel har foelgende raekker:

Email Navn tid status
'a@bc.de' 'navn1' 2010-12-02 'status1'
'f@gh.ij' 'navn2' '2010-12-03 'noget bestemt tekst'

og det er i den sidste linie du skal have tiden updated?

I saafald vil jeg foreslaa at du erklaerer $status udenfor loekken og saa i loekken sammenligne med $myrow['status'].  For eksempel saaledes:

$status = 'noget bestemt tekst';
while ($myrow = mysql_fetch_array($result))
{
  $Navn = $myrow['Navn'];
  echo "$Navn <br/>";
  if($myrow['status'] != $status)
  {
    $updated = mysql_query("UPDATE mintabel SET tid=now() WHERE Navn = '$Navn');
    echo "DB er opdateret <br/>";
  }
mysql_close($Db);

I min kode gaar jeg ud fra at der bestaar adskillige raekker i tabellen hvor du skal have udskrift for hver raekke paa en ny linie, derfor <br/>.

Hvis jeg har misforstaaet problemet saa forklar.
Avatar billede erikjacobsen Ekspert
14. november 2010 - 19:08 #3
Disse to linier giver ingen mening:

$status = "noget bestemt tekst";
if ($status != "noget bestemt tekst") {

Hvad er det helt præcist du vil?
Avatar billede erikjacobsen Ekspert
14. november 2010 - 19:10 #4
Ja, Christian, men når "Jeg har en tabel med Email, Navn, tid " så er der vel ikke et felt med status i tabellen?
14. november 2010 - 19:16 #5
..og jeg stoetter foroevrigt showsources forslag om at bruge mysql_error() : $updated - mysql_query("UPDATE......")or die(mysql_error());

Og saa ville jeg have skrevet:

if($updated) echo "DB er opdateret <br/>";  I saafald kommer meddelelsen kun for raekker hvor opdateringen er lykkedes.
14. november 2010 - 19:18 #6
erikjacobsen, det var det jeg spurgte SPOERGSMAALSSTILLEREN om.  Som vi er enige om, koden som den nu er skrevet giver ingen mening, men jeg er temmelig sikker paa at der er en mening bagved, og for at hjaelpe proever jeg at finde ud af hvad den mening er.
Avatar billede showsource Seniormester
14. november 2010 - 19:23 #7
Allerede den første query fejler vel ?
A
Og det er vel muligt blot:

mysql_query("UPDATE tabel SET tid = NOW() WHERE feltnavn != 'Bestemt tekst'") or die (mysql_error());

echo mysql_affected_rows()." rows er opdateret!";
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 19:31 #8
Hej alle.

Jo, jeg ved godt at:

$status = "noget bestemt tekst";
if ($status != "noget bestemt tekst")

ikke giver mening.

Skrev det lidt hurtigt, da tnakerne fløj.

$status er en variabel som der ikke findes i DB og ej heller skal tilføjes der.

Jeg skulle have anført, at $status er en variabel der som sådan kan antage 4 forskellige værdier.
Lad os bare sige 1,2,3 eller 4.

$status = "YY";
if ($status != "XX")


YY hentes via indlæsning af noget data andetsteds fra og $status sættes derfor lig med denne.

I løkken tjekkes der om denne $status er forskellig fra den hentede, f.s.v.a. de enkelte navne der hentes.

Jeg kunne sådan set også have anført:
$status = "YY";
if ($nystatus != "YY")

men det er slet ikke alt det der er vigtigt for mig.

Det er dog vigtigt, at jeg har dette udsagn og IF-statement med.

or die (mysql_error());  giver ikke noget udsagn om fejl.

Ved ikke rigtig hvordan jeg skal forklare det ellers.
Avatar billede erikjacobsen Ekspert
14. november 2010 - 19:36 #9
Du kunne prøve at uddybe "noget data andetsteds fra" - for mig giver din forklaring nemlig stadig ingen mening.
Avatar billede showsource Seniormester
14. november 2010 - 19:36 #10
Så er det nok fordi error_reporting er disabled.

mysql_query("SELECT * FROM mintabel)",$Db);

vil da fejle i min verden ?
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 19:46 #11
showsource>......

En tanketorsk, fordi jeg havde ændret midlertidigt i koden.
Der skulle have stået:

$result = mysql_query("SELECT * FROM mintabel WHERE DATE_ADD(tid, INTERVAL 300 minute) > NOW()",$Db);

erikjacobsen>

anførte ikke nedennævnte vedr. $status, da det bare måske ville gøre forvirringen større :)

$status = file_get_contents('http://www.etstedicyberspace.com/online_status/?'.$Navn.'&status');

Håber det hjalp.
Avatar billede erikjacobsen Ekspert
14. november 2010 - 19:52 #12
Så kan det give mening, ja ;)

Du skal så notere dig om det du får tilbage med file_get_contents er eksakt det du sammenligner på, eller om der er linieskift, eller andre sager, der gør, at de to tekster ikke er ens.

Ellers kan du sammenligne med en delstreng af det du får tilbage.
Avatar billede erikjacobsen Ekspert
14. november 2010 - 19:52 #13
14. november 2010 - 19:55 #14
r4wh1d3, det er maaske mig der er tungnem.  Forklar lidt mere.

(1)  Tabellen 'mintabel' har mange raekker.  I nogle af raekkerne skal tiden opdateres, i andre raekker ikke.  Korrekt? 

(2)  I din loekke skal det for hver raekke besluttes om raekken skal opdateres eller ej.  Det goer du ved at du har en 'ekstern' vaerdi af $status der kommer 'andetsteds fra' og denne vaerdi sammenligner du med en status vaerdi der paa en eller anden maade hoerer til raekken.    Er det ogsaa korrekt?

Det jeg ikke forstaar er hvor denne anden statusvaerdi kommer fra?  Hvad er det du sammenligner med hvad for at beslutte om raekken skal opdateres eller ej?
14. november 2010 - 19:58 #15
Der kom adskillige indlaeg mens jeg arbejdede med mit.  Hvis problemet er loest saa glem mit sidste indlaeg.
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 20:04 #16
erikjacobseb>...

Jeg er 100% sikker på, at det jeg får retur med file_get_contents er eksakt det jeg sammenligner med.

Eksempelvis kunne vi sige, at værdierne for $status kan antage følgende:

ONLINE
OPTAGET
STRAKS TILBAGE
OFFLINE


Christian_Belgien>....

ad (1): Ja, 'mintabel' har mange rækker og i nogle kan 'tid' være genstand for opdatering.

ad (2): Korrekt

Det jeg sammenligner med kunne eksempelvis være en onlinestatus

P.S. Det har vitterligt givet mig adskillige grå hår det her :)
14. november 2010 - 20:11 #17
Hvor faar du saa onlinestatus fra for de enkelte raekker saa du kan finde ud af om raekken skal opdateres eller ej?
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 20:22 #18
Christian_Belgien>...

Som sådan er det i denne sammenhæng underordnet, hvorfra jeg henter onlinestatus,- det kunne for den sags skyld være fra et alternativ til et messenger-system eller diskussionsforum etc.

Mit problem er isoleret betragtet, at den løkke jeg har ikke fungerer, da den ikke fanger de elementer, der er genstand for opdatering af 'tid'.
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 20:31 #19
P.S. Det skal i øvrigt bemærkes, at jeg lige nu har konstateret, at den første række i tabellen rent faktisk bliver opdateret, når betingelsen er opfyldt, men resterende rækker forbliver uændrede, selvom nogle af disse også skulle have været opdateret.
Avatar billede erikjacobsen Ekspert
14. november 2010 - 20:40 #20
Når vi nu er så langt, så lige den bemærkning, at det ikke er så smart at lukke din forbindelse førend du er helt færdig.
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 20:50 #21
Erik - Jeg ved slet ikke hvad jeg skal sige.

Andet end et kæmpe stort TAK.

Fatter ikke hvordan jeg kunne overse det.

Alt virker perfekt nu

Kan ikke engang huske hvordan jeg skal give point, da det er år siden jeg var inde sidst, men prøver at find ud af det om lidt.

Mange tak. Det har ganske enkelt reddet min nattesøvn
Avatar billede r4wh1d3 Nybegynder
14. november 2010 - 21:06 #22
Jeg logger af nu, men kigger ind i morgen for at give point.
Tak til alle i øvrigt for Jeres bidrag og fortsat god aften :)
Avatar billede r4wh1d3 Nybegynder
15. november 2010 - 12:55 #23
Hmm. Troede måske at Erik gerne ville have point, men kan selvfølgelig godt se ud af 'signaturen', at der ikke 'samles' på disse.

Jeg lukker tråden i morgen, hvis jeg ikke hører andet.

P.S. Mit script spiller som en drøm i den sammenhæng det skulle anvendes, så endnu engang tak og jeg kan fortsat ikke komme mig over min mysql_close($Db).
Skoven og træerne, tror jeg ;)
17. november 2010 - 15:07 #24
r4wh1d3, nu soerger du vel for at faa lukket spoergsmaalet?  Ellers bliver det siddende som et grimt evigheds-aabent spoergsmaal paa min (og andres) lister af indlaeg.  Det medlem du gerne ville have gievet points oensker dem ikke.  Saa maa du selv oprette et svar og acceptere det.
Avatar billede r4wh1d3 Nybegynder
17. november 2010 - 15:25 #25
Næ, Erik samler forståeligt nok ikke på dem, så hermed lukkes spørgsmålet.
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