13. september 2006 - 10:05Der er
20 kommentarer og 1 løsning
Like søgning ud fra felt
Jeg har en side hvor jeg skal finde en mail adresse ved hjælp af en søgning. Problemet er at flere mails er rodet dvs. at der er et mellemrum før eller efter adressen, derfor kan jeg ikke finde dem direkte med WHERE =.
Jeg er nød til at bruge noget LIKE %% halløj men har lidt bøvl med at få den til at virke.
Jeg skal have lavet du med den her kode..
$mailname = mysql_query("SELECT * FROM mail_systen WHERE m_email LIKE '%". $_POST["email"] ."%'") or die(mysql_error()); $count = (mysql_num_rows($mailname)); if($count == 1) {
Jeg vil tro mit problem ligger i at få styret " og ' korrekt.
Nogen der kan få skruet den rigtig sammen. $_post kommer selvfølgelig fra en form på siden og søgning bliver lavet når mail er indtastet i feltet og der trykkes ok.
hmm det lyder maerkeligt, jeg har lige proevet på min egen maskine og det virker fint. Kan se at du checker om du har fået et hit. Er du sikker på at du ikke får mere end 1 hit ? Proev etc. at skrive $count ud og se hvor mange rows den har returneret.
Det er mail_systen jo og jeg kan netop ikke bruge = som jeg også skriver.
Onkel_satan ahh det var jo fordi at lige præcis den mail jeg testede med var der to gange. Hvis jeg ændre til $count => 1 så for jeg bare en blank side.
Det der skal ske er at den søger på en mail og og hvis den findes i databassen skal den slettes.
Er der en nem måde jeg kan gå databasen igennem for dubletter ??
Jeg har nu funder dubletter ved hjælp af følgende...
select m_email, count(m_email) as antal from mail_systen group by m_email having count(m_email)>1
Det giver mig en fin liste over de mails der står der flere gange og hvor mange gange de står der... der er dog ikke nogen nem måde til at trykke på dem og slette den ene. Da den finder lige godt 500 ville det være rart at kunne komme igennem dem lidt nemmere end kopiere og søg ved dem alle sammen....
Nu ved jeg ikke praecis hvad der er din side goer, men jeg ville nok forslå at forbygge imod dubeltter. Dette kan du goere ved at goere dit m_email felt unikt. Så skal mysql nok brokke sig hvis du forsoeger at indsaette en eksisterende email adresse. Hvis du allerede har en database med dubletter i ville jeg lave et midlertidigt script i php til at rense ud med. Foerst koere du en "select m_email, count(m_email) as antal from mail_systen group by m_email having count(m_email)>1" for at finde alle dubletterne. Derefter kan du loope alle dubletterne igennem og slette dem en af gangen, du kan f.eks. springe den foerste over og slette resten.
Der kan ikke oprettes nye dubletter i systemet men jeg har hentet en gammel database ind som en anden har lavet og der er nogen i.
Jeg kan nemt finde dem frem som jeg skrev jeg har gjort.. men hvordan løber jeg resultatet igennem og sletter de forskellige uden at slette alle... hvis der er 4 som er ens skal den jo kun slette de 3. Hvis 2 ens kun slette 1 osv...
Er jeg nød til at gå dem igennem manuelt eller kan man kode sig ud af noget ??
sql_connect(); $sqlQuery = "select m_email from mail_system group by m_email having count(m_email)>1"; $reuslt = sql_hent_funktion($sqlQuery); foreach($result as $row){ $sqlQuery = "SELECT id FROM mail_system WHERE m_email='".$row[0]."'"; $result2 = sql_hent_funktion($sqlQuery); for($i=1; count($result2) > $i; $i++ ){ // Her springer vi den foerste over (hvis vi ville slette alle skulle $i=0) og sletter resten $row2 = $result2[$i]; $sqlQuery2 = "DELETE FORM mail_system WHERE id='".$row2[0]."'"; sql_query_funktion($sqlQuery2); } } sql_close();
Har nu lavet en php fil med følgende kode. Det virker dog stadig ikke :(
Jeg ved ikke lige hvad der går galt. Det ID du selecter på et tidspunkt hva er det for et ??
Smid et svar om alle omstændigheder så du kan få nogle points.
<? include ("mysql_connect.php"); mysql_connect($host,$user,$pass); mysql_select_db($db);
$sqlQuery = "select m_email from mail_systen group by m_email having count(m_email)>1"; $reuslt = sql_hent_funktion($sqlQuery); foreach($result as $row){ $sqlQuery = "SELECT id FROM mail_systen WHERE m_email='".$row[0]."'"; $result2 = sql_hent_funktion($sqlQuery); for($i=1; count($result2) > $i; $i++ ){ // Her springer vi den foerste over (hvis vi ville slette alle skulle $i=0) og sletter resten $row2 = $result2[$i]; $sqlQuery2 = "DELETE FORM mail_systen WHERE id='".$row2[0]."'"; sql_query_funktion($sqlQuery2); } }
ohh ja.. glemte jeg lige at naevne hehe... tror jeg mp have gang i kaffemaskinen
Ovenstående virker kun hvis dine raekker har en unik atribute som f.eks. et id nr. (jeg gaettede bare på at du havde det og var kaldt ID). Hvis ikke du har en unik attribute er ikke muligt at pege på en specifik raekke.
Og så skal du lige huske at 'sql_hent_funktion()' og 'sql_query_funktion()' er fiktive funktion. De findes ikke med mindre du selv implementer dem. Jeg kan klart anbefale at laver en mysql.php fil hvor du har dine sql funktioner. Det goer meget hurtigere (og paenere)at lave database kald.
Du kan få den jeg bruger, så slipper du selv for at lave den. Gem det her i en mysql.php fil
function sql_query($query) { $resultat = mysql_query($query);
if(!$resultat) { udskriv_fejl("Kunne ikke udføre: <em>$query</em>"); } return true; }
function sql_close() { if(!mysql_close()) { udskriv_fejl("Kunne ikke lukke forbindelsen til MySQL!"); } }
function udskriv_fejl($fejl) { echo "<p>$fejl";
if ($mysql_fejl = mysql_error()) { echo "<br>Fejlen er: <em>$mysql_fejl</em>"; }
exit; }
Fra nu af skal du bare skrive include('mysql.php'); og saa kan du fyre dine database kald af ved bare ar skrive
sql_connect(); sql_query("INSERT INTO tabel SET navn='Christian'"); // bruges til indsaet, slet redigere $result = sql_query_anwser("SELCET * FROM tabel"); // Bruges til hente fra fra databasen sql_close(); foreach($result as $row) echo $row[0] // Udskriver: Christian
Jeg har en id række som er primære og selvfølgelig uniq. Skulle bare være sikker på det var det du mente :)
Jeg connecter jo til databasen øverst i filen med mysql connect og den del virker fint nok er det samme jeg bruger alle steder :)
Har lige retet det lidt til nu så det bruger den id jeg har
<? include ("mysql_connect.php"); mysql_connect($host,$user,$pass); mysql_select_db($db);
$sqlQuery = mysql_query ("select m_email from mail_systen group by m_email having count(m_email)>1" or die(mysql_error()); $reuslt = sql_hent_funktion($sqlQuery); foreach($result as $row){ $sqlQuery = "SELECT m_id FROM mail_systen WHERE m_email='".$row[0]."'"; $result2 = sql_hent_funktion($sqlQuery); for($i=1; count($result2) > $i; $i++ ){ // Her springer vi den foerste over (hvis vi ville slette alle skulle $i=0) og sletter resten $row2 = $result2[$i]; $sqlQuery2 = "DELETE FORM mail_systen WHERE m_id='".$row2[0]."'"; sql_query_funktion($sqlQuery2); } }
?>
Nu er det vel fint nok ned til din sql_hent_funktion. Går ud fra det er der den går galt i byen...
Yep.. du skal bare have rettet mysql kaldende til. Vil klart anbefale dig at bruge de funktioner jeg har givet dig. De goer det saa meget nemmere og simplet, plust at den udskriver sql fejlen hvis der skulle vaere nogen.
Har nu lavet en fil med nøjagtig det du skrev og smidt op og lavet følgende kode i php fil også. Når jeg går ind på siden for jeg bare en hvid side ingen reaktioner eller fejl. <? include ("mysql.php");
$sqlQuery = "select m_email from mail_systen group by m_email having count(m_email)>1"; $reuslt = sql_hent_funktion($sqlQuery); foreach($result as $row){ $sqlQuery = "SELECT m_id FROM mail_systen WHERE m_email='".$row[0]."'"; $result2 = sql_hent_funktion($sqlQuery); for($i=1; count($result2) > $i; $i++ ){ $row2 = $result2[$i]; $sqlQuery2 = "DELETE FORM mail_systen WHERE m_id='".$row2[0]."'"; sql_query_funktion($sqlQuery2); } }
sql_hent_funktion() og sql_query_funktion() var bare nogle jeg greb ud af den blå luft. Hvis du bruger den mysql.php fil (hvilket du siger du goer) hedder de sql_query_anwser() og sql_query()
nu har du vel husket at saette $kodeord = "dit_kodeord"; $_database = "din_database"; ? Jeg har ikke selv afproevet koden saa jeg kan ikke garantere at det virker men jeg kan ikke se hvorfor det ikke skulle virke. Proev evt. at debugge lidt på det. Om ikke andet så burde du kunne se ideen med koden.
De ting som sql_hent_funktionen er vel stadig ikke defineret eller er de ??
Koden:::
<? include ("mysql.php"); sql_connect(); $sqlQuery = "select m_email from mail_systen group by m_email having count(m_email)>1" or die(mysql_error(); $reuslt = sql_hent_funktion($sqlQuery); foreach($result as $row){ $sqlQuery = "SELECT m_id FROM mail_systen WHERE m_email='".$row[0]."'" or die(mysql_error(); $result2 = sql_hent_funktion($sqlQuery); for($i=1; count($result2) > $i; $i++ ){ $row2 = $result2[$i]; $sqlQuery2 = "DELETE FORM mail_systen WHERE m_id='".$row2[0]."'" or die(mysql_error(); sql_query_funktion($sqlQuery2); } } sql_close(); ?>
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.