Probléma PHP Table ékezetes karaktereivel és MySQL-el

Probléma PHP Table ékezetes karaktereivel és MySQL-el
2019-08-03T21:07:24+02:00
2019-08-04T23:01:25+02:00
2022-10-15T21:41:15+02:00
Natsu
Sziasztok!
Néztem a többi ehhez hasonló témát, de sehol sem találtam megoldást. Az a gondom egészen pontosan, hogy a webes admin felületen (végre, nagy nehezen összehoztam valamit, korábban arról kérdeztem :D) van egy tablem, adatokkal. Az adatokat ha szerkesztem, az AJAX segítségével újratöltés nélkül frissül a Tableben és az adatbázisba is eljutnak az adatok. Ha az adatbázist szerkesztem, akkor pedig a table frissül... mindez jól megy, csak az ékezetes karaktereket nem szereti. Akármit is próbáltam, ha a Tablebe ékezetes karaktert írok, akkor a MySQL-ben azok a karakterek rosszul jelennek meg. Ha a MySQL-en belül hozzáadok ékezetes karakterű adatot az adatbázishoz, az a MySQL-ben jól megjelenik, de a webes Table be sem tölt, helyette ezt a hibakódot írja:
DataTables warning: table id=user_data - Invalid JSON response. For more information about this error, please see 1. Warning: Invalid JSON response

Ez a kódom:
autok.php
<html>
<head>
<title>Autoszalon</title>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
<script src="Datatables1.js"></script>
<script src="https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap.min.js"></script>






<style>
#user_data {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}

#user_data td, #user_data th {
border: 1px solid #ddd;
padding: 8px;
}

#user_data tr:nth-child(even){background-color: #f2f2f2;}

#user_data tr:hover {background-color: #ddd;}

#user_data th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #4CAF50;
color: white;
}
</style>

</head>
<body>
<h1 align="center">Autószalon</h1>
<br />
<div class="table-responsive">
<br />
<div align="right">
<button type="button" name="add" id="add" class="btn btn-info">Hozzáad</button>
</div>
<br />
<div id="alert_message"></div>
<table id="user_data" class="table table-bordered table-striped">
<thead>
<tr>
<th>Autó</th>
<th>Ár</th>
<th>Alkalmazott</th>
<th></th>
</tr>
</thead>
</table>
</div>
</div>
</body>
</html>

<script type="text/javascript" language="javascript" >
$(document).ready(function(){

fetch_data();

function fetch_data()
{
var dataTable = $('#user_data').DataTable({
"processing" : true,
"serverSide" : true,
"order" : [],
"ajax" : {
url:"fetch.php",
type:"POST"
}
});
}

function update_data(id, column_name, value)
{
$.ajax({
url:"update.php",
method:"POST",
data:{id:id, column_name:column_name, value:value},
success:function(data)
{
$('#alert_message').html('<div class="alert alert-success">'+data+'</div>');
$('#user_data').DataTable().destroy();
fetch_data();
}
});
setInterval(function(){
$('#alert_message').html('');
}, 5000);
}

$(document).on('blur', '.update', function(){
var id = $(this).data("id");
var column_name = $(this).data("column");
var value = $(this).text();
update_data(id, column_name, value);
});

$('#add').click(function(){
var html = '<tr>';
html += '<td contenteditable id="data1"></td>';
html += '<td contenteditable id="data2"></td>'
html += '<td contenteditable id="data3"></td>';
html += '<td><button type="button" name="insert" id="insert" class="btn btn-success btn-xs">Insert</button></td>';
html += '</tr>';
$('#user_data tbody').prepend(html);
});

$(document).on('click', '#insert', function(){
var auto = $('#data1').text();
var ar = $('#data2').text();
var alkalmazott = $('#data3').text();
if(auto != '' && ar != '' && alkalmazott !='')
{
$.ajax({
url:"insert.php",
method:"POST",
data:{auto:auto, ar:ar, alkalmazott:alkalmazott},
success:function(data)
{
$('#alert_message').html('<div class="alert alert-success">'+data+'</div>');
$('#user_data').DataTable().destroy();
fetch_data();
}
});
setInterval(function(){
$('#alert_message').html('');
}, 5000);
}
else
{
alert("Egy mezot kihagyott!");
}
});

$(document).on('click', '.delete', function(){
var id = $(this).attr("id");
if(confirm("Biztosan torolni szeretne?"))
{
$.ajax({
url:"delete.php",
method:"POST",
data:{id:id},
success:function(data){
$('#alert_message').html('<div class="alert alert-success">'+data+'</div>');
$('#user_data').DataTable().destroy();
fetch_data();
}
});
setInterval(function(){
$('#alert_message').html('');
}, 5000);
}
});
});
</script>

fetch.php
<?php
//fetch.php
$connect = mysqli_connect("localhost", "root", "", "autoszalon");
$columns = array('ID', 'Auto', 'Ar', 'Alkalmazott');
$query = "SELECT * FROM automenu ";

if(isset($_POST["search"]["value"]))
{
$query .= '
WHERE auto LIKE "%'.$_POST["search"]["value"].'%"
OR alkalmazott LIKE "%'.$_POST["search"]["value"].'%"
';
}

if(isset($_POST["order"]))
{
$query .= 'ORDER BY '.$columns[$_POST['order']['0']['column']].' '.$_POST['order']['0']['dir'].'
';
}
else
{
$query .= 'ORDER BY id DESC ';
}

$query1 = '';

if($_POST["length"] != -1)
{
$query1 = 'LIMIT ' . $_POST['start'] . ', ' . $_POST['length'];
}

$number_filter_row = mysqli_num_rows(mysqli_query($connect, $query));

$result = mysqli_query($connect, $query . $query1);

$data = array();

while($row = mysqli_fetch_array($result))
{
$sub_array = array();
$sub_array[] = '<div contenteditable class="update" data-id="'.$row["id"].'" data-column="Auto">' . $row["Auto"] . '</div>';
$sub_array[] = '<div contenteditable class="update" data-id="'.$row["id"].'" data-column="Ar">' . $row["Ar"] . '</div>';
$sub_array[] = '<div contenteditable class="update" data-id="'.$row["id"].'" data-column="Alkalmazott">' . $row["Alkalmazott"] . '</div>';
$sub_array[] = '<button type="button" name="delete" class="btn btn-danger btn-xs delete" id="'.$row["id"].'">Törlés</button>';
$data[] = $sub_array;
}

function get_all_data($connect)
{
$query = "SELECT * FROM automenu";
$result = mysqli_query($connect, $query);
return mysqli_num_rows($result);
}

$output = array(
"draw" => intval($_POST["draw"]),
"recordsTotal" => get_all_data($connect),
"recordsFiltered" => $number_filter_row,
"data" => $data
);

echo json_encode($output);

?>

insert.php
<?php
$connect = mysqli_connect("localhost", "root", "", "autoszalon");
if(isset($_POST["auto"], $_POST["ar"], $_POST["alkalmazott"]))
{
$auto = mysqli_real_escape_string($connect, $_POST["auto"]);
$ar = mysqli_real_escape_string($connect, $_POST["ar"]);
$alkalmazott = mysqli_real_escape_string($connect, $_POST["alkalmazott"]);
$query = "INSERT INTO automenu(auto, ar, alkalmazott) VALUES('$auto', '$ar', '$alkalmazott')";
if(mysqli_query($connect, $query))
{
echo 'Adat Elmentve';
}
}
?>

update.php
<?php
$connect = mysqli_connect("localhost", "root", "", "autoszalon");
if(isset($_POST["id"]))
{
$value = mysqli_real_escape_string($connect, $_POST["value"]);
$query = "UPDATE automenu SET ".$_POST["column_name"]."='".$value."' WHERE id = '".$_POST["id"]."'";
if(mysqli_query($connect, $query))
{
echo 'Adat Frissitve';
}
}
?>

Gyanítom valamelyikben/valamelyikekben van a hiba, de sehol sem találom, ezért megköszönném a segítséget. :D Még annyi infó, hogy a MySQL-en belül a kódolás az "Auto" és "Alkalmazottak" oszlopoknak utf8mb4_hungarian_ci, és a webes adminfelületen a Tableben jól megjelennek az ékezetes karakterek, ha ott írom be (csak MySQL-be rosszul viszi át), csak akkor ír errort, ha a MySQL-be írom az ékezetes karakteres dolgot, aztán frissítem a webes Tablet.
Mutasd a teljes hozzászólást!
Hali!

1. Használd a forráskód-gombot (a szerkesztő-mező felett, balról a harmadik: </>), ha forráskódot illesztesz be.
2. Minden legyen UTF-8. Az adatbázis/táblák, fájlok (PHP, HTML, CSS, JS, stb.), a visszaküldött tartalom (akár header()-rel megtámogatva, ha alapból nem az). Megjegyzés: az utf8mb4_hungarian_ci nem kódolás, hanem egyeztetés/illesztés (collation), aminek a sztringek összehasonlításában, rendezésében van szerepe.
3. Adatbázishoz kapcsolódás után egyből állítsd be a kapcsolat karakterkódolását is a mysqli_set_charset() segítségével:
… $connect = mysqli_connect("localhost", "root", "", "autoszalon"); if (!mysqli_connect_errno() && mysqli_set_charset($connect, "utf8")) { … } …
4. Használd ki a mysqli paraméterezett lekérdezés lehetőségét. Nem csak a mysqli_real_escape_string()-et „lőheted” vele ki.
5. Próbálj meg átállni a mysqli objektum-orientált használatára, nagyban megkönnyíted vele a dolgodat (és egyszerűbbé is teszed vele a kódot).

Mutasd a teljes hozzászólást!

  • Szerintem kezdetnek ezt olvasd el, tanuld meg szóról szóra az egészet, de főleg a 'Hibakeresés' részt.
    Ékezetes FAQ webművészek számára
    Mutasd a teljes hozzászólást!
  • Hali!

    1. Használd a forráskód-gombot (a szerkesztő-mező felett, balról a harmadik: </>), ha forráskódot illesztesz be.
    2. Minden legyen UTF-8. Az adatbázis/táblák, fájlok (PHP, HTML, CSS, JS, stb.), a visszaküldött tartalom (akár header()-rel megtámogatva, ha alapból nem az). Megjegyzés: az utf8mb4_hungarian_ci nem kódolás, hanem egyeztetés/illesztés (collation), aminek a sztringek összehasonlításában, rendezésében van szerepe.
    3. Adatbázishoz kapcsolódás után egyből állítsd be a kapcsolat karakterkódolását is a mysqli_set_charset() segítségével:
    … $connect = mysqli_connect("localhost", "root", "", "autoszalon"); if (!mysqli_connect_errno() && mysqli_set_charset($connect, "utf8")) { … } …
    4. Használd ki a mysqli paraméterezett lekérdezés lehetőségét. Nem csak a mysqli_real_escape_string()-et „lőheted” vele ki.
    5. Próbálj meg átállni a mysqli objektum-orientált használatára, nagyban megkönnyíted vele a dolgodat (és egyszerűbbé is teszed vele a kódot).

    Mutasd a teljes hozzászólást!
  • Jelentem a 3. pontban leírt megoldást egyből ki is próbáltam, és működik az egész. :D Ez hihetetlen, ha tudnád, hány órát szenvedtem ezzel, örök hála. :D
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd