Avatar billede nemlig Professor
26. oktober 2007 - 17:33 Der er 19 kommentarer og
1 løsning

tjek om samme nr. anvendes i flere MySQL-poster

Hej.
Jeg har en tabel med en hel del poster.
Et af felterne, "xid" har et 20-cifret nr. og det samme nr. må ikke forekomme i flere af posterne.

Håber på et kode-bidrag til, hvordan man kan lave et lille script, som tjekker om samme tal i feltet "xid" forekommer i flere poster.
Avatar billede leif Seniormester
26. oktober 2007 - 17:41 #1
Du bør så lave feltet til Unique så kan det ikke ske :-)
Avatar billede nemlig Professor
26. oktober 2007 - 17:52 #2
Det er jeg med på fremadrettet - men jeg er nødt til at tjekke om dobbelt forekomster i den eksisterende database.
Avatar billede nemlig Professor
26. oktober 2007 - 18:30 #3
Tror jeg har styr på det alligevel.
Jeg kører 1 while, hvor jeg lister samtlige poster.
Og for hver post jeg lister, laver jeg en SELECT, hvor jeg søger på XID ift. den aktuelle XID.
Og hvis der der er flere end 1 resultater, så vis posten.

Men det kan være, der er en smartere og mere simpel løsning.
Avatar billede nielle Nybegynder
26. oktober 2007 - 18:40 #4
Skulle gerne udpege de eksisterende dublettter i tabellen:

SELECT xid, count(*) AS antal
FROM dinTabel
GROUP BY xid
HAVING antal > 1
ORDER BY xid
Avatar billede nemlig Professor
26. oktober 2007 - 19:14 #5
Jeg gør følgende:

$sql = "SELECT xid, count(*) AS antal FROM kalender_aftale GROUP BY xid HAVING antal > 1 ORDER BY xid";
$res = database($sql);
   
    while($row = mysql_fetch_array($res))
    {
    echo "<br>".$row['xid'];
    }

Men resultatet er tom, selvom jeg ved der er 2 ens poster.
Kan du se, hvad der står forkert?
Avatar billede nielle Nybegynder
26. oktober 2007 - 19:26 #6
Har du prøvet at indtaste SQL'en i din phpMyAdmin?
Avatar billede nemlig Professor
26. oktober 2007 - 19:51 #7
Jo - det virker. Hvorfor virker det ikke via PHP - det er måske ikke meningen.
Avatar billede nielle Nybegynder
26. oktober 2007 - 19:56 #8
Hvad sker der i din database() funktion?
Avatar billede nemlig Professor
26. oktober 2007 - 20:10 #9
function database($sql){//Funktion der laver alm databasekald og returnerer resultatet
  $config = ini();//Hent databaseparametre
  $conn = mysql_connect($config[db_serv],$config[db_user],$config[db_pass]);//Åben databaseforbindelse
  if (!$conn) {
  die('Could not connect: ' . mysql_error());
  }
  $res = mysql_db_query($config[db_base],$sql); //Udfør forespørgsel
  mysql_close($conn);//Luk databaseforbindelse
  if (!$res) {//Tjek om det gik godt
    die("<b>Databasefejl:<br></b>" . mysql_error($conn) ."<b><br>MySQL-sætningen var:<br></b>". $sql);//Udskriv fejlmelding og stop udførsel
  }
  return $res;//Returner resultat af forespørgsel
}
Avatar billede nielle Nybegynder
26. oktober 2007 - 20:23 #10
Det er ikke specielt performende at lave en mysql_connect() for hvert SQL-kald. Hellere lave forbindelsen en gang for alle i en fil som du includer i toppen af de sider der skal bruge database.
Avatar billede nemlig Professor
26. oktober 2007 - 20:29 #11
Jeg mener da også, at jeg kun connecter 1 gang, ellers forstår jeg ikke....
Tak for koden ovenfor, som virker i PhpMyAdmin - det er helt fint for mig.

Sender du et svar :-)
Avatar billede nielle Nybegynder
26. oktober 2007 - 20:35 #12
Din database() funktion klaver en connect og en disconnect for hver SQL-sætning der udføres på siden. Det er alt for mage gange - de bør kun laves en gang i alt.
Avatar billede nielle Nybegynder
26. oktober 2007 - 20:38 #13
Jeg gætter i øvrigt at din nnuværende kode fejler fordi at du laver en diconnect før at duy er færdig med at arbejde med de fundne rækker.

Prøv i stedet med denne her:

// Funktion der laver alm databasekald og returnerer resultatet
function database($sql) {
    //Hent databaseparametre
    $config = ini();

    // Åben databaseforbindelse
    $link = mysql_connect($config['db_serv'], $config['db_user'], $config['db_pass']) or
        die('Could not connect: ' . mysql_error());

    // Vælg database
    $db_selected = mysql_select_db($config['db_base'], $link) or
        die('Could not select table: ' . mysql_error());

    //Udfør forespørgsel
    $result = mysql_query($sql) or
        die('<b>Databasefejl:<br></b>' . mysql_error() . '<b><br>MySQL-sætningen var:<br></b>' . $sql);

    // Returner resultat af forespørgsel
    return $result;
}
Avatar billede nielle Nybegynder
26. oktober 2007 - 20:39 #14
... hvor jeg som sagt vil anbefale at kaldene til mysql_connect() og mysql_select_db() tages ud af funktionen og udføres i en fil som includes i toppen af siden.
Avatar billede nemlig Professor
26. oktober 2007 - 20:43 #15
OK - så er jeg med.
Tak endnu engang.
Avatar billede nielle Nybegynder
26. oktober 2007 - 20:51 #16
Vi er vel ikke færdige endnu? Du skal lige have afprøvet om det virker...
Avatar billede nemlig Professor
26. oktober 2007 - 21:06 #17
Jo tak. Men der er tale om et system, som p.t. består af ca. 100 forskellige filer, hvori der gøres brug af den nuværende database-funktion. Så jeg skal lige overskue det og have tid til at afteste.
Mit spørgsmål i denne tråd har du løst for mig, hvorfor jeg synes vi afslutter denne del nu.
Hvis dit forslag til ny connect volder problemer, vender jeg tilbage i en ny tråd. Jeg sætter meget pris på dine kommentarer og gode forklaringer.
Avatar billede nielle Nybegynder
26. oktober 2007 - 21:13 #18
Cool, du får et svar :^)

Men tænk lige over denne her:

Hvis din nuværende kode ikke giver samtlige rækker for den ovennævnte SQL ... ja, så er der fejl i din kode. For selvfølgeligt skal resultatet være det samme i PHP som i PhpMyAdmin. Og hvis der er fejl i koden, er det så klogt at bassere resten af sitets kode på den?
Avatar billede nemlig Professor
26. oktober 2007 - 21:34 #19
UPS - jeg har lige opdaget, at koden kl. 19.14.12 virker udmærket. Der var ingen dubletter i den pågældende database. Det må du meget undskylde. Men jeg har da fået noget ud af det, da du så fik kigget på min database-funktion.
Avatar billede nielle Nybegynder
26. oktober 2007 - 21:39 #20
:^)
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