[MEGOLDVA] SQL lekérdezés nem ismeri az UTF-8 karaktereket.

Sziasztok!

Eléggé kezdő vagyok még, bocsássatok meg.

Tehát: van egy UTF-8 táblám, ezt szeretném lekérdezni az alábbi kódrészlettel (illetve a módosított változatával),ebből: id: Árvíztűrő tükörfúró, Name: Árvíztűrő Tükörfúró ez lesz:

id: �rv�zt?r? T�k�rf�r� - Name: �rv�zt?r? T�k�rf�r�

Mit lehet ezzel kezdeni?


<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "
";
}
} else {
echo "0 results";
}
$conn->close();
?>

Hozzászólások

Content-Type: text/html; charset=utf-8

Megy ilyen fejléc?

Ha end-to-end mennek binárisan az utf-8 karakterek, akkor csak ez lehet a gond. Ha valahol elveszik az utf-8 átkódolás miatt, azt meg csak ott lehet javítani értelemszerűen (tábla encoding, mysql kapcsolat encoding, stb).

--

A legelejére:
header('Content-Type: text/html; charset=UTF-8');

A mysql csatlakozás mögé pedig
$conn->query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

// Happy debugging, suckers
#define true (rand() > 10)

$conn->set_charset("utf8");

a lekérdezés előtt?

Most nincs lehetőségem rá.

Itt van az egész:
<?php
header('Content-type: text/html; charset=utf-8');
$servername = "localhost";
$username = "user";
$password = "pass";
$dbname = "db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM otlet";
$result = $conn->query($sql);
$conn->query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
$conn->set_charset("utf8");
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "
id: ". $row["leiras"]. " - Name: ". $row["nev"]. " " . $row["email"] . "
";
}
} else {
echo "0 results";
}

$conn->close();
?>

A nagy kérdés, hogy a tárolt adatok is UTF8-asok-e.

Láttam már olyat, hogy latin1 volt a tábla és varchar mezők, de utf8 adatok voltak benne. Így ha utf8-ként akarta lekérdezni az ember, akkor kiksz-krakszok voltak, viszont latin1-ként lekérdezve, kiechozva utf8 content-type-pal olvasható volt.

És ez visszafelé is igaz. Az insertnél oda kell figyelni, hogy megfelelő karakterkódolással menjen a query (amit a kolléga fentebb írt a set_charset dologgal). Lehet már itt csúszott el a dolog.

szokásos dolgok.

a php fájlaid legyenek mind utf8-bn kódolva. (notepad++-ban utf8 BOM nélkül)

a mysql connectek és db select-ek stb után:

SET NAMES utf8;
SET collation_connection = 'utf8';

a php-d legeleslegelején legyen:
header('Content-Type: text/html; charset=utf-8');

html részben legyen:
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

És végül a mysql táblákat is nézd át pma-ban. legyen utf8-ra állítva minden szöveges meződ, de a tábla fajtája is és az adatbázis kódolása is. én amúgy utf8_unicode_ci -at használom, már több mint 7 éve és minden jó volt vele.

Valaki írta, hogy tudd meg valóban utf8-ban vannak e kódolva a sorok.

Érdemes még próbálkozni egy utf8_decode vagy utf8_encode -val php-ban. (ha a táblában nem utf8, akkor encode, ha NEM UTF8-ra akarod kódolni hanem pl latin2-re, akkor decode.

<?php
header('Content-type: text/html; charset=utf-8');
$servername = "localhost";
$username = "usr";
$password = "pass";
$dbname = "db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM idea";
$result = $conn->query($sql);
$conn->query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
$conn->set_charset("utf8");
$conn->query("SET NAMES utf8,SET collation_connection = 'utf8'");
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "
id: ". $row["leiras"]. " - Name: ". $row["nev"]. " " . $row["email"] . "
";
}
} else {
echo "0 results";
}

$conn->close();
?>

fent is írták, hogy nem jó a sorrend:


<?php
header('Content-type: text/html; charset=utf-8');
$servername = "localhost";
$username = "usr";
$password = "pass";
$dbname = "db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$conn->set_charset("utf8");
$conn->query("SET NAMES utf8,SET collation_connection = 'utf8'");
$conn->query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

$sql = "SELECT * FROM idea";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo " id: ". $row["leiras"]. " - Name: ". $row["nev"]. " " . $row["email"] . "";
}
} else {
echo "0 results";
}

$conn->close();
?>

semmi gond, szív.

viszont még valami, bár lehet én vagyok régimódi és most így is megy, DE:

$conn->query("SET NAMES utf8,SET collation_connection = 'utf8'");

helyette:
$conn->query("SET NAMES utf8;SET collation_connection = 'utf8'");

vagy írd őket külön sorba, a pontosvessző választja el a lekérdezéseket ez szerintem így nem megy át a query-ben hiba nélkül ha sima vesszővel tolod.

jah, és pls zárd le a code vagy quote tagot a kérdésedben!

a mezők, a db minden utf8_bin, aztán set names utf8 minden konnektkor, meg a html is utf8 headerrel, meg a file is utf8 BOM nélkül, akkor mennie kell.
tehát röviden, mindig minden utf8.

------------------------
Jézus reset téged

Mennyire vagy kezdő? Ha nagyon az elején tartasz mindennek, akkor "én" azt tanácsolom, hogy tanulás céljából mozdulj el a Python felé. Ha a Python alapjai megvannak(tényleg csak az alapok), akkor rá lehet mozdulni a Flask keretrendszerre. Azon kívül, hogy a Flask egy nagyon jó keretrendszer, Python tanulásra is abszolút alkalmas.

Flask: http://flask.pocoo.org/
PostgreSQL: http://www.postgresql.org/
SQLAlchemy: http://www.sqlalchemy.org/
De nem is linkelek tovább, mert van jó néhány dolog ami kelleni fog, de ez az igényeidtől függ. Mint pl. Flask-Migrate: https://flask-migrate.readthedocs.org/en/latest/

Flaskhez ez egy jó alap: https://exploreflask.com/