Autor Zpráva
grossik
Profil
Nechtěl jsem tu ani psát, ale už fakt nevím, jak mám tento problém vyřešit.

Mám kód:

    <input type="text" name="nove_jmeno_mesta" id="nove_jmeno_mesta" value="<?php echo $jmeno_mesta ?>" style="text-align: center;">
    <button onclick="nazev_zmen()">Změnit</button>
    
<script charset="windows-1250" type="text/javascript">
  
function nazev_zmen() {
    var jmeno = "<?php echo $jmeno?>";
    var nove_jmeno = document.getElementById("nove_jmeno_mesta").value;

    $.ajax({ url: '/system/jmeno_mesta_zmen.php',
        data: {jmeno: jmeno, nove_jmeno: nove_jmeno},
     type: 'POST',
     success: function() {
         location.reload();                                  
     },
       } );    
}
</script>    

A jmeno_mesta_zmen:
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<?php
header("Content-Type: text/html; charset=windows-1250");

if(isset($_POST["jmeno"])){
    
    $dbserver         = "localhost";
    $dbusername     = "root";
    $dbpassword     = "";
    $db             = "mhra";

    $conn = new mysqli($dbserver, $dbusername, $dbpassword, $db);
    mysqli_query($conn, "SET NAMES cp1250");
    
    if ($conn->connect_error)
    {
        die("Connection failed: ".$conn->connect_error);
    }
    
    $username = $_POST['jmeno'];
    $mesto_nove_jmeno = $_POST['nove_jmeno'];
    
    $sql = "SELECT * FROM mesto WHERE hrac = '$username'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_assoc($result);
    
    $jmeno_mestas = $row['jmeno_mesta'];
    
    if($jmeno_mestas == $mesto_nove_jmeno) {
        header("Location: index.php");
        die();
    } else {
        $sql = "UPDATE mesto SET jmeno_mesta = '$mesto_nove_jmeno' WHERE hrac = '$username'";
        if ($conn->query($sql) === TRUE)
        {
            header("Location: index.php");
            die();
        }
    }
    
} else {
    header("Location: index.php");
}
?>

Ale vždy, když dám do inputu nějaký háček nebo čárku tak to udělá tohle např. chtěl jsem aby se uložilo Město ale místo toho se uloží MÄ›sto.

Chyba musí být někde v ajaxu, protože když v jmeno_mesta_zmen místo $sql = "UPDATE mesto SET jmeno_mesta = '$mesto_nove_jmeno' WHERE hrac = '$username'"; dám $sql = "UPDATE mesto SET jmeno_mesta = 'Něco' WHERE hrac = '$username'"; tak to vypíše v pohodě tak jak má. Vážně nevím už co s tím :(
Radek9
Profil
grossik:
Je kódování v obou dokumentech skutečně windows-1250? Nestačí jen nastavit hlavičku / meta tag.
grossik
Profil
Ano, všude je windows-1250.
rafej
Profil
grossik
Před řádky 30, 36 a 42 (před přesměrováním pomocí header) na všech místem zopakuj toto:

header("Content-Type: text/html; charset=windows-1250");

Napiš, jestli to pomohlo.
_es
Profil
grossik:
Z minulých svojich vlákien si si nezobral hlavné rady a neujasnil si poriadne, čo sa deje na strane servera - PHP a na strane prehliadača vrátane JavaScriptu a stále to nezmyselne zliepaš dokopy bez premyslenia základnej funkčnosti.
Je aj stránka s prvým kódom vo windows-1250? Čo dáš do atribútu charset v <script> nehrá rolu. Dokumentácia jQuery: api.jquery.com/jQuery.ajax skús zadať contentType. Na čo posielaš dáta cez AJAX, keď aj tak potom celú stránku „reloaduješ“ (14. riadok)? Veď na to predsa existujú normálne formuláre, ktoré ti budú fungovať spoľahlivo a odošlú dáta aj úplne bez JS. Formulárové elementy tam už máš, tak ich stačí len normálne použiť.

rafej [#4]:
A kam a ako by sa to asi tak malo presmerovať? Veď ten PHP skript sa zavolá v 10. riadku JS a jeho odpoveď sa úplne ignoruje (13. - 15. riadok). Nezmyselné je do toho skriptu nejaké presmerovanie dávať či hocijaké iné HTTP hlavičky alebo meta značku, ktorá pri spracovaní cez AJAX aj tak nemá zmysel.
rafej
Profil
_es:
Vidím jen to, co nám sem bylo nahráno. Očividně ne všechno a je to dost zmatené. A přiznávám, že jsem to přelétla jen letmo.
Poslat header před odpovědí skriptu má smysl i v AJAXu. Možná byt to nemělo hrát roli, ale moje reálná zkušenost je bohužel jiná.

grossik
1. kód
Chybí zpracování výsledku dotazu na řádku 13-15. Obslužný skript (2. kód) by měl buď odesílat odpověď o výsledku akce nebo vrátit i novou hodnotu (například ve formátu JSON, XML pro složitější věci) nebo vypsat (pomocí echo, print v případě prostého textu), která se vloží do tvého políčka. Ty tu hodnotu nejen neodesíláš (2. kód), ale ještě si ji v ajaxu ani nepřečteš a nikam neuložíš ani nevypisuješ.
Najdi si nějaké příklady, jak se kontroluje výsledek ajaxového dotazu a jak se získává výsledek. Jeden odkaz na api máš přímo v příspěvku od _es:.
2. kód
Na první řádce máš zbytečný meta tag s kódováním, ten tam nemá co dělat.
A také je potřeba upravit obslužný php skript, buď pouze pro ajax nebo aby uměl obsloužit zároveň i klasický požadavek z formuláře (ze kterého tu přetrvaly pro Ajax kontraproduktivní přesměrování header location).
grossik
Profil
Děkuju všem za (ne)pomoc, musel jsem si na to přijít sám.

Stačilo jen do js dát
var jmeno_n = nove_jmeno.replace(/[\u00FF-\uFFFF]/g, function(p){ return "&#" + p.charCodeAt(0) });
a jmeno_n dát místo nove_jmeno do ajaxu.
Radek9
Profil
grossik:
To není správně řešení. Evidentně ti zlobí kódování a tímhle to jen oblbneš. Reálně teď budeš mít v databázi HTML entity a tím pádem můžeš třeba zapomenout na fulltext vyhledávání atp.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: