Ga naar inhoud


PHP/MySql importeren vanuit notepad en collatie


Hendrik6073

Aanbevolen berichten

Ik heb voor een database achter een website een tekstbestand ontvangen met daarin 1100 regels (namen).

Deze wil ik importeren in de database.

De import verloopt goed.

 

Als ik een query doe om op een gedeelte te zoeken

(bijvoorbeeld: SELECT * FROM namen WHERE naam like '$letter%' and geslacht='heren'). Krijg ik geen results.

 

Nu ben ik er inmiddels achter dat het probleem hem waarschijnlijk in de collatie zit. Ik heb het bestand al opgeslagen als utf-8, unicode etc. en daarna opnieuw geimpoteerd. Ook de tabel heb ik al aangepast en gelijk gemaakt aan het type dat ik in het tekst bestand opsla.

 

gebruik als editor voor het tekstbestand notepad. Ook heb ik als een Excel CSV bestand gebruikt. Niets had het gewenste resultaat.

 

Wat de aan te bevelen manier om de geimporteerde data ook binnen dergelijk query's te kunnen gebruiken ?

 

Bij voorbaat dank.

Link naar reactie
Delen op andere sites


Die is gemaakt in phpmyadmin.

Ik heb inmiddels wel voor elkaar om de gegevens in beeld te krijgen. Kwam erachter dat er (welliswaar onzichtbaar) spaties in de namen zaten met een trim() commando heb ik deze eruit gehaald en zie dus nu de namen wel met een zoekactie.

 

Maarrrrrr....... zo eenvoudig kon het natuurlijk niet zijn, als ik nu een naam bijplaats wordt deze in een sortering niet goed meegenomen. kan ik op een of andere manier mijn schrijf en selectie actie een bepaalde colatie meegeven ?

 

Bij voorbaat dank.

 

nb.is het misschien verstandiger de tabel opnieuw aan te maken met bepaalde instellingen ?

Link naar reactie
Delen op andere sites

Dan kun je ook in phpmyadmin een export van de structure doen.

 

Maar wat ik eigenlijk wilde zien is de character set (collation) die je gebruikt hebt voor de table. Controleer eens of die op latin1_swedish_ci staat volgens phpmyadmin.

 

En wat de rest van de vraag betreft, dat wordt moeilijk om daarover te oordelen. Ik heb geen idee wat er in je database zit en hoe je het eruit probeert te halen.

Ik zou zeggen, kijk eens met phpmyadmin of je die queries daarmee wel kunt doen. Zo ja, dan kun je phpmyadmin de query in php-format laten weergeven. Zo nee, dan moet je op zoek naar de oorzaak.

Link naar reactie
Delen op andere sites

Origineel bericht van: Hendrik6073
Ik heb inmiddels wel voor elkaar om de gegevens in beeld te krijgen. Kwam erachter dat er (welliswaar onzichtbaar) spaties in de namen zaten met een trim() commando heb ik deze eruit gehaald en zie dus nu de namen wel met een zoekactie.

Dit klinkt alsof je de tabel hebt aangemaakt met een vaste breedte, dus geen varchar, maar een char. Een varchar stript automatisch de spaties aan het einde, een char vult het om met NULL .
Mijn advies is om de tabel om te zetten naar een varchar. Dit kan gewoon met phpmyadmin volgens mij... Dan zou je ook van je andere probleem af moeten zijn.

“Success is not final, failure is not fatal: it is the courage to continue that counts.” ~ Winston Churchill

Link naar reactie
Delen op andere sites

ik heb het aangepast naar varchar, kan idd een deel van het probleem zijn geweest.

Heb nu de tabel opnieuw aangemaakt in UTF_GENERAL_CI

Bestand is in kladblok opgeslagen als UTF-8

Ik lees het bestand uit en stop hem in de databasemet hieronder staande script (1).

 

Als ik nu met PHP een insert (2) doe en bijvoorbeeld alle namen

uitvraag met een bepaalde letter en sorteer (3), krijg ik eerst alle namen keurig gesorteerd en daarna als laatste de naam welke handmatig is toegevoegd.

 

Kan ik tijdens het toevoegen geen

collatie meegeven ? Dit is wel vreemd, nooit eerder last van gehad.

 

(1).........................................................

$file = fopen("namen.txt", "r") or exit("Unable to open file!");

//Output a line of the file until the end is reached

while(!feof($file))

{

$naam = fgets($file);

 

echo "$naam<br>";

 

$naam = trim($naam);

// $geslacht = trim($geslacht);

 

$naam = ucfirst(strtolower($naam));

 

MYSQL_QUERY ("INSERT INTO namen (geslacht,naam) VALUES ('dames','$naam')");

 

}

fclose($file);

 

(2)...................................................

 

 

MYSQL_QUERY ("INSERT INTO namen (geslacht,naam) VALUES ('$geslacht','$naam')");

 

(3)......................................................

 

$query1 = "SELECT * FROM namen WHERE naam like '$letter%' and geslacht='heren' order by 'naam'";

$sql1 = mysql_query ($query1) or die (mysql_error());

 

while ($row = mysql_fetch_array ($sql1)){

$naam = $row['naam'];

 

 

 

echo "<td width='14%'><div align='left'><span class= namen'>

<a href='winkel.php?naam=$naam&type=$type'>$naam</a>

</span></div></td>"

 

 

Link naar reactie
Delen op andere sites

Wordt echt lastig om iets over te zeggen als we maar een klein deel van de info hebben.

- Verschil tussen hoofd- en kleine letters misschien?

- Voorloopspaties in de bestaande records misschien?

En zo zijn er vast nog wel meer gissingen te maken.

 

Laat phpmyadmin eens een complete export van structure en data doen en zet het resultaat hierneer, dan weten we tenminste waar we over praten.

 

Link naar reactie
Delen op andere sites

Probeer dit eens

Php Code:

<?php$query1 = "SELECT * FROM namen WHERE naam like '$letter%' and geslacht='heren' order by 'naam'";$sql1 = mysql_query ($query1) or die (mysql_error());while ($row = mysql_fetch_array ($sql1)){$naam = $row['naam'];$lijnen .= "<td width='14%'><div align='left'><span class= namen'><a href='winkel.php?naam=$naam&type=$type'>$naam</a></span></div></td>";}?>

 

Dan in je html code

 

Html:
<table><tr><?php print $lijnen; ?></tr></table>

iMac 27" macOS Sierra
iPhone 5s iOS 10

Link naar reactie
Delen op andere sites

oeps idd blush

 

Wat me nu opvalt is dat er order by 'naam' staat.

 

In mijn query's zet ik de tabel waarop is sorteer nooit tussen quote's en het commando altijd in hoofdletters

Misschien zit het daar in.

 

Dus

 

$query1 = "SELECT * FROM namen WHERE naam LIKE '$letter%' and geslacht='heren' ORDER BY naam";

 

iMac 27" macOS Sierra
iPhone 5s iOS 10

Link naar reactie
Delen op andere sites

Hoofd- of kleine letters voor de MySQL arguments maakt niet uit. Mag je door elkaar gebruiken.

 

Die quotes rondom naam, da's wel een goeie ja. Alleen zou ik een MySQL error verwachten of geen resultaat als het probleem daaruit voortkomt. Maar het zou wel een hoop kunnen verklaren.

 

Stel dat het hele ORDER BY deel van de query helemaal niet uitgevoerd wordt vanwege die quotes rondom naam.

Als de records allemaal al op naamvolgorde in de tabel zijn opgeslagen, dan verklaart dat het eindresultaat. Dan wordt de laatst toegevoegde naam onderaan de tabel toegevoegd en is het eigenlijk bij toeval dat de overige records er wel op volgorde uitkomen.

 

Link naar reactie
Delen op andere sites

Origineel bericht van: Duwgati
Hoofd- of kleine letters voor de MySQL arguments maakt niet uit. Mag je door elkaar gebruiken.

Die quotes rondom naam, da's wel een goeie ja. Alleen zou ik een MySQL error verwachten of geen resultaat als het probleem daaruit voortkomt. Maar het zou wel een hoop kunnen verklaren.




idd, de arguments (kon daarstraks niet op het woord komen :D ) zijn ongevoelig voor hoofd en kleine letters. Het is gewoon een kwestie van duidelijkheid.

Je verwacht dan idd een error, maar het hangt er vanaf op welke server de site draait, Ik heb al verschillende malen meegemaakt dat mysql errors niet worden weergegeven. Zelfs als je de functie mysql_error() gebruikt.
Raar maar waar.

iMac 27" macOS Sierra
iPhone 5s iOS 10

Link naar reactie
Delen op andere sites

Origineel bericht van: Puch
Wat me nu opvalt is dat er order by 'naam' staat.


Nou, ik ben toch wel erg blij dat mensen kritisch meedenken/kijken.
idd weg quotes weg probleem !

De import was idd al alphabetisch gesorteerd dus ik heb noit stilgestaan bij het feit
dat de sortering fout kon zijn. En idd geen enkele PHP fout ontvangen.

Allemaal hartelijk dank voor het meedenken !
Link naar reactie
Delen op andere sites

ik denk dat dit inderdaad niet juist is.

 

je moet altijd .... ORDER BY naamveld geven

dus nooit die naamveld tussen een '' of " " zetten.

 

is idem met aspx.

 

 

Link naar reactie
Delen op andere sites

Maak een account aan of log in om te reageren

Je moet een lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Registreer voor een nieuwe account in onze community. Het is erg gemakkelijk!

Registreer een nieuwe account

Inloggen

Heb je reeds een account? Log hier in.

Nu inloggen
  • Wie is er online   0 leden

    • Er zijn geen geregistreerde gebruikers deze pagina aan het bekijken
×
×
  • Nieuwe aanmaken...