ugrás a tartalomhoz

PHP-MySQL ékezetes karakterek nem íródnak be a táblába

tanulo · 2013. Ápr. 22. (H), 09.54
Kórtörténet: Localhoston fut minden,a php file utf-8 a mysql utf-8 mysql ini file-ban a beállítás mindenen utf-8,a post-on átküldött adatok kapcsolódás előtt kiíratva még ékezetesek.Az ékezet nélküli karakterek beíródnak a táblába és ki is olvashatóak,az ékezetes karakterek meg sem jelennek és az utánuk kővetkezők karakterek sem.Ha a mysql commandon viszem be az adatokat a táblába a helyzet ugyan ez.Ha viszont oda vissza konvertálom a karaktereket iconvval akkor minden hibátlan,de még a keresett kifejezést is át kell fordítanom.Arra kéne nekem ötlet hogy tudom kihagyni a folyamatból az oda vissza konvertálást.
<?php 
       
	$urlcim = $_POST['urlcim'];
	$cim = $_POST['cim'];
	$eloado = $_POST['eloado'];
        $szerzo = $_POST['szerzo'];
	$ar = $_POST['ar'];
	
	if (!$urlcim || !$cim || !$eloado || !$szerzo || !$ar) {
		echo "Nem minden adatot adott meg.<br />"."Kérjük, próbálja meg újra!";
		exit;
	}
	
        $cim = iconv("ISO-8859-2", "UTF-8", $cim);
        $eloado = iconv("ISO-8859-2", "UTF-8", $eloado);
        $szerzo = iconv("ISO-8859-2", "UTF-8", $szerzo);

	if (!get_magic_quotes_gpc()) {
		$urlcim = addslashes($urlcim);
		$cim = addslashes($cim);
		$eloado = addslashes($eloado);
                $szerzo = addslashes($szerzo);
		$ar = doubleval($ar);
	}
        
	$adatbazis = new mysqli('localhost', 'zenekodb', 'zenek0000', 'zenek');

        if (mysqli_connect_errno()) {
		echo "Hiba: Nem sikerült kapcsolódni az adatbázishoz. Kérjük, próbálkozzon később.";
		exit;
	}

        mysql_query("SET NAMES 'utf8'");
        mysql_query("SET CHARACTER SET 'utf8'");
        mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'");
        mysql_query("SET character_set_results = 'utf8'");
        mysql_query("SET character_set_server = 'utf8'");
        mysql_query("SET character_set_client = 'utf8'");

	$lekerdezes = "INSERT INTO dalok VALUES('".$urlcim."', '".$cim."', '".$eloado."', '".$szerzo."','".$ar."')";
	$talalat = $adatbazis->query($lekerdezes);
	
	if ($talalat) {
		echo $adatbazis->affected_rows." db dal hozzá lett adva az adatbázishoz.";
	} else {
		echo "Hiba történt. A daltt nem sikerült hozzáadni.";
	}
	
	$adatbazis->close();
?>
 
4

Kiolvasáskor pedig csak igy jelenik meg normálisan

tanulo · 2013. Ápr. 22. (H), 11.41
Valamit biztos nem veszek észre mert beíráskor utf-8 kell átfordítani latin2 re kiolvasáskor pedig latin2 kell visszafordítani utf-8 ra,pedig a mysql mindenhol utf-8.
<?php

  $keresesi_tipus=$_POST['keresesi_tipus'];
  $keresesi_kifejezes=trim($_POST['keresesi_kifejezes']);
  
  if (!$keresesi_tipus || !$keresesi_kifejezes) {
    echo 'Nem adta meg a keresési feltételeket. Kérjük, adja meg ezeket!';
    exit;
  }

  if (!get_magic_quotes_gpc()){
    $keresesi_tipus = addslashes($keresesi_tipus);
    $keresesi_kifejezes = addslashes($keresesi_kifejezes);
  }

  $keresesi_kifejezes = iconv("ISO-8859-2", "UTF-8", $keresesi_kifejezes);

  $adatbazis = new mysqli('localhost', 'zenekdb', 'zenek0000', 'zenek');

  if (mysqli_connect_errno()) {
    echo 'Hiba: Nem sikerült kapcsolódni az adatbázishoz. Kérjük, próbálkozzon később!';
    exit;
  }

  $lekerdezes = "SELECT * FROM dalok WHERE ".$keresesi_tipus." LIKE '%".$keresesi_kifejezes."%'";
  $talalat = $adatbazis->query($lekerdezes);
  
  $talalatok_szama = $talalat->num_rows;

  echo "<p>A keresési feltételeknek megfelelő dalok száma: ".$talalatok_szama."</p>";

  for ($i=0; $i <$talalatok_szama; $i++) {
     $sor = $talalat->fetch_assoc();
     echo "<p><strong>".($i+1).". urlCim: ";
     echo stripslashes($sor['urlcim']);
	 echo "</strong><br />Cím: ";
         echo iconv("UTF-8", "ISO-8859-2", stripslashes($sor['cim']));
	 echo "<br />Előadó: ";
         echo iconv("UTF-8", "ISO-8859-2", stripslashes($sor['eloado']));
	 echo "<br />Szerző: ";
	 echo iconv("UTF-8", "ISO-8859-2", stripslashes($sor['szerzo']));
         echo "<br />Ára: ";
	 echo stripslashes($sor['ar']);
	 echo "</p>";
  }

  $talalat->free();
  $adatbazis->close();

?>
1

Legközelebb kérlek eleve PHP

Poetro · 2013. Ápr. 22. (H), 10.29
Legközelebb kérlek eleve PHP kódszínezőt használj, ne nekem kelljen. Továbbá, miért nem eleve UTF-8-as oldalt csinálsz, miért latin2-est? Akkor nem kellene keresztbe kasul konvertálgatni az adatokat.
2

szia

tanulo · 2013. Ápr. 22. (H), 10.45
Én utf-8 ast szeretnék használni minden azon is áll a beállítások szerint de úgy nem íródnak be az ékezetes karakterek. Áruld el hogy kell a színezett kódot beírni {}ezel a gombbal az elölnézet valami kaotikus látvány
3

[colorer=php\]Kódod[/colorer]

Poetro · 2013. Ápr. 22. (H), 11.09
[colorer=php\]Kódod[/colorer] segítségével (a \ jelet vedd ki, azt csak azért raktam oda, hogy láthatóvá váljon).
5

köszönöm

tanulo · 2013. Ápr. 22. (H), 11.43
Az első kód verzió iconv nélkül indult de úgy nem adja át a táblának az ékezetes betűket. A gyanús az a történetben hogy ha parancssorból viszem be az adatokat note padon megírva "utf-8" akkor sem íródnak be a táblába az ékezetes betűk sem az utánuk következő karakterek. Nem értem hol kerül bele a képbe a latin2.az egybevetések a mysql ben mindenhol utf-8,az ini file mindenhol utf-8. ???
6

Ha a táblaszerkezet esetleg

anti81 · 2013. Ápr. 22. (H), 12.18
Ha a táblaszerkezet esetleg nem saját kreálmány, ellenőrizd a szöveges mezők collation-jét is, mert lehetséges eltérőre beállítani a táblánál megadottól.
7

A táblát is elkészítettem

tanulo · 2013. Ápr. 22. (H), 13.09
A táblát is elkészítettem több féle képpen,MySQL command-on,parancssor-on,php-mysql admin felületen,minden hol ahol lehetséges megadtam a default carset utf-8 at,az egybevetést táblánkén és soronként is.A php-mysql adminen látható is mindehol az utf-8.
Azt nem értem hogy miért kell átkonvertálni a php változókat latin2 ről utf-8 ra hogy mysql felismerje az ékezeteket,mikor elvileg utf-8 ban van.ha átküldöm a php bol flash be "az alapban csak utf-8 at ismer" ott megvannak az ékezetek,ha kiíratom echo-val vagy print-el php ban a változókat az is ékezetes.Ha az alábbi módon használom az iconv-ot az azt jelenti hogy latin2 ről konvertál utf-8 ra?
<?php $cim = iconv("ISO-8859-2", "UTF-8", $cim);>?
De ha logikusan nézzük ha át kell konvertálni akkor az addigi kódolás latin2 mitől?
de ha ugyan ebbe a táblába mysql commandal töltöm az adatokat txt file-ból ugy sem irja be az ékezeteket,a txt file utf8,hogy tudom kiíratni a php vel hogy milyen a futó carset kódolása? viszont ha a táblából olvasok és nem fordítom vissza az adatokat akkor
minden féle furcsa ékezetes karakterek jönnek.mint ha a php nem lenne utf8.
a php ini file default carset latin1,de átirhatom bármire és újra indíthatok a helyzeten nem változtat.Ez úgysem sem lenne megoldás mert hálós szerver ini file-ját nem írhatom át.
8

mysql != mysqli és mysqli::set_charset

Endyl · 2013. Ápr. 22. (H), 13.18
Csak elírás, hogy miután a 26. sorban mysqli-vel csatlakozol, a 33-38. sorban sima mysql függvényeket használsz?

Ha mysqli-t használsz, akkor a "SET NAMES utf8" helyett a doksi szerint inkább mysqli::set_charset-et kéne.

Továbbá, ha a bejövő adatokat ISO-8859-2-ból UTF8-ra konvertálod tároláskor, majd kiíratáskor fordítva, és jól jelenik meg a böngészőben, akkor hiába UTF8 a php fájlod, a kiküldött html-t a böngésző ISO-8859-2-nek látja (ha nem annak látná, nem lenne jó az iconv-s konvertálás, vagy nem lenne rá szükség). Megfelelő Content-type headert küld a szerver (vagy te php-ból)? A vonatkozó meta tag szerepel az oldalon?
9

A sima mysql fuggvényeket

tanulo · 2013. Ápr. 22. (H), 13.42
A sima mysql fuggvényeket csak kínomban raktam be,de mindegy hogy bent van vagy nincs,nem változtat semmin.(a használatban lévő kódból ki is szedtem) meta tag nincs de azt is probáltam" header("Content-Type: text/html; charset=UTF-8");"
vagy ezt is"<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">"
eredménytelenül.
Abban biztos igazad van hogy ha át kell fordítani akkor latin2 van,azt is értem hogy a böngésző látja másnak,de nem tudom miért.Azt viszont nem értem hogy ha közvetlenül viszek adatot a táblába utf8 ast akkor miért nem íródnak be az ékezetesek hisz nincs böngésző ami megváltoztassa a txt file kódolását
10

Parancssori bevitelnél lehet

Endyl · 2013. Ápr. 22. (H), 13.58
Parancssori bevitelnél lehet a konzolod nem megfelelő kódolásra állítva, valamint a kliens és a szerver inijében is lehet hiba.

Pontosan milyen paranccsal, milyen környezetben próbálod a parancssort?
11

A szerver ini je latin1 a

tanulo · 2013. Ápr. 22. (H), 14.13
A szerver ini je latin1 a mysql ini je minden hol utf8
a szerver windows alat fut localhoston apache 2.2.8
php 5.5.6
mysql 5.0.51b
phpMyAdmin Database Menager 2.10.3

a mysql command ezekkel települt,mélyebben nem ismerem nem régóta ismerkedem a mysql el
amint az a sok kérdésem mutatja.
De az biztos hogy valami kódolási zűrzavar van.
Az utf8 bom nélkül vagy bom-al kell ha notepad++ ban mentem a file-t?
12

A mysql commandon ez a

tanulo · 2013. Ápr. 22. (H), 14.21
A mysql commandon ez a bevitel

USE zenek;

INSERT INTO dalok VALUES
("aaaaaa.mp3", "áááááá", "őőőőőőő", "űűűűűű", 900 ),
("bbbbbb.mp3", "óóóóóó", "ééééééé", "öööööö", 800 );
15

Akkor próbáld így: USE

Endyl · 2013. Ápr. 22. (H), 14.38
Akkor próbáld így:

USE zenek;
SET NAMES utf8;

INSERT INTO dalok VALUES
("aaaaaa.mp3", "áááááá", "őőőőőőő", "űűűűűű", 900 ),
("bbbbbb.mp3", "óóóóóó", "ééééééé", "öööööö", 800 );
ui.: és ahogy látod, sql-re is működik a korábban már említett colorer ;)
13

mysql --help

Endyl · 2013. Ápr. 22. (H), 14.32
A mysql --help parancs kimenetében a következő résznél:
Default options are read from the following files in the given order:
megtalálod, hogy milyen fájlokból inicializál. A mysql --print-defaults kimenetében pedig valahol benne kéne lennie a használt character setnek (igaz, a helpben is benne van ez az info).
14

köszi. megnézem,de most

tanulo · 2013. Ápr. 22. (H), 14.38
köszi. megnézem,de most elmegyek ebédelni,és majd jóllakottan kipihenten este nekiülök újra. habár tudom hogy ha az adatbázis adatait vissza kell fordítani utf8 rol latin2 re hogy a php a böngészőben helyesen jelenítse meg akkor az eltárolt adat utf8.
azért a parancssoros help et megnézem.
16

BOM nélkül

asam9 · 2013. Ápr. 23. (K), 00.12
BOM nélkül mentsd a fájlokat.
17

A hiba oka számomra kideríthetetlen

tanulo · 2013. Ápr. 23. (K), 09.29
mysql> SHOW VARIABLES LIKE 'char%';
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
Ezt a választ a mysql command line client adta
ha ezzel viszem be az adatokat txt file-bol :query ok,2 rows affected, 6 warnings
ha billentyűzeten begépelem ugyan ez a válasz és az eredmény is, az ékezetes betűk helye üresen marad a sorokban.Abban az esetben ha átállítom a carset-et SET NAMES latin1 vagy latin2 akkor latin1 nél pár helyre tesz valamilyen furcsa ékezetes karaktert latin2 nél ha jól emlékszem csak az űűűű jelenik meg.
A tábla caracter lekérdezésére a válasz utf8,de a bevitelkor sehogy nem ír be ékezetet
18

Megtaláltam a megoldást a konvertálás mellőzésére

tanulo · 2013. Ápr. 23. (K), 21.56

<?php 
 $urlcim = $_POST['urlcim'];
 $cim = $_POST['cim'];
 $eloado = $_POST['eloado'];
 $szerzo = $_POST['szerzo'];
 $ar = $_POST['ar'];
 if (!$urlcim || !$cim || !$eloado || !$szerzo || !$ar)
 {
 echo "Nem minden adatot adott meg.<br />"."Kérjük, próbálja meg újra!";
 exit; 
 }
 if (!get_magic_quotes_gpc())
 { 
 $urlcim = addslashes($urlcim);
 $cim = addslashes($cim); 
 $eloado = addslashes($eloado);
 $szerzo = addslashes($szerzo);
 $ar = doubleval($ar); 
 } 
 $adatbazis = new mysqli('localhost', 'zenekoldal', 'zenek1967', 'zenek');
 $adatbazis->set_charset('latin2');
 if (mysqli_connect_errno()) 
 {
 echo "Hiba: Nem sikerült kapcsolódni az adatbázishoz. Kérjük, próbálkozzon később.";
 exit;
 }
 $lekerdezes = "INSERT INTO dalok VALUES('".$urlcim."', '".$cim."', '".$eloado."', '".$szerzo."','".$ar."')";
 $talalat = $adatbazis->query($lekerdezes); 
 if ($talalat)
 {
 echo $adatbazis->affected_rows." db dal hozzá lett adva az adatbázishoz.";
 }
 else 
 {
 echo "Hiba történt. A dalt nem sikerült hozzáadni."; 
 }
 $adatbazis->close();
 ?>
Kiolvasáskor pedig ugyan így.Ettől függetlenül arra még mindig nem találtam válasz hogy miért latin2 a változók adata viszont 2 napos intenzív mysqli tanfolyam alatt sokat tanultam,igy jobban látom hogy van még pár év tanulni valóm.
19

Escape

Pepita · 2013. Ápr. 24. (Sze), 19.03
Escape-elésre jobb, ha a mysql_real_escape_string fv-t használod.
A latin2-re meg kéne találni a választ, ha minden utf-8 lenne, akkor nem kellene. Vissza kéne nézned pl. ini_get-el az aktuális beállításokat, de most fejből nem tudok konkrétumokat. Illetve csinálhatnál a fájlon belül is egy változót $valami='Árvíztűrő...';, aztán echo mb_detect_encoding($valami, "auto"); sorral kiírathatod ennek a kódolását, hátha a post-tal jött adatok a latin2-esek csak, vagy valamiért a fájlod / PHP kódolása nem jó.
Mindenképp a detektálást javaslom az állítgatás helyett: előbb derítsd ki, mi nem jó.
20

Escapelésre a

MadBence · 2013. Ápr. 24. (Sze), 21.51
Escapelésre a mysql_real_escape_string használata nem javasolt (sőt, az egész mysql modul használata sem).
Helyette ott van pl. a mysqli, ami támogatja a paraméteres lekérdezéseket, ami biztosítja a biztonságos SQL végrehajtást.
21

Szia pepita

tanulo · 2013. Ápr. 24. (Sze), 23.41
Megcsináltam amit javasoltál,az eredmény UTF-8.
echo mb_detect_encoding($valami, "auto");
Ezt eddig is sejtettem de most legalább biztos.Azt hiszem kipróbálom egy ingyenes szerveren lévő mysql-en.
Olvastam valahol hogy te nem nagyon élteted a flash-t.Csináltam pár flash es dolgot
és érdekelne hogy mivel tudnék hasonló dolgokat létrehozni ami nem flash.
A HTML-5 ben gondolkodtam de sokan már az előtt temetni kezdték mielőtt kiforrta volna magát.Ilyesmikre gondolokhttp://www.bolygofoto.atw.hu
A CSS-hez annyit értek hogy stíluslapot hozzak létre benne XML nek vagy Flash AS3 nak,de láttam már flash mentes szép animációkat is,csak már nem tudom hol és hogy mivel születtek.
22

Azt hiszem a linket nem jól

tanulo · 2013. Ápr. 24. (Sze), 23.52
Azt hiszem a linket nem jól illesztettem be.
www.bolygofoto.atw.hu
vagy
www.blackbullpizza.uw.hu
Szóval valami ilyesmi mozgásokat miben lehet jól megvalósítani,és az sem árt ha androidon vagy más mobilon is megjelenik.
24

Új téma

Pepita · 2013. Ápr. 25. (Cs), 21.05
Ez inkább egy másik téma lenne (a megfelelő kategóriában), de az az igazság, hogy én nem csak a flash-t, de az izgő-mozgó, villogó csili-viliket sem szeretem. Egyszerűbb dolgokat meg simán meg lehet oldani gif képpel meg css2-vel, esetleg egy kis js-jquery.

A karakterkódolásra sajna nincs több ötletem.
23

Jobb

Pepita · 2013. Ápr. 25. (Cs), 21.00
Az addslashes-nél még mindig jobb. Következő (egyszerű) lépés. A mySql is támogatja a paraméteres lekérdezéseket, csak nem véd helyetted, ami sokszor nem is baj.