Diakritika neodešle formulář – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Diakritika neodešle formulář – PHP – Fórum – Programujte.comDiakritika neodešle formulář – PHP – Fórum – Programujte.com

 

Jarda
~ Anonymní uživatel
199 příspěvků
25. 9. 2019   #1
-
0
-

Hezký den,

s přechodem na nový webhosting se objevil zajímavý problém s češtinou ve formuláři diskusního fóra. A to sice, když použiji v některém poli formuláře diakritiku, tak se zpráva vůbec neodešle do databáze (resp odešle se prázdná). Když diakritiku nepoužiji, zpráva se odešle naprosto v pořádku. To platí jak o textu zprávy tak o jménu přispěvatele. Kódování používám na stránce i v databázi CP1250. Vím, že to je splácanina, ale jsem amatér a dříve mi to fungovalo. V čem může být prosím problém? Děkuji.

 Formulář:

<form method="post" action="<?php echo $phpself; ?>" name="formular">
<input type="hidden" name="action" value="<?php echo $action; ?>" />
<?php echo $frmappend.$nl; ?>


<table border="0">


<input type="hidden" name="name" size="50"<?php if($config['gbook']['name_max'] != '') echo ' maxlength="'.$config['gbook']['name_max'].'"'; ?> value="<?php echo whatPrint($name,'prezdivka',''); //if($_SESSION['name'] != '') echo '" disabled="disabled'; ?>" />


<tr class="left">
  
  <td><textarea name="message" cols="45" rows="4" onkeypress="javascript:count(<?php echo $pocetznaku; ?>);" onkeyup="javascript:count(<?php echo $pocetznaku; ?>);"><?php echo $message; ?></textarea><br /></td>
</tr>
<?php if($config["gbook"]["use_check"] == true && !$loggeduser){	//Obrázek s eísly ?>

<?php } ?>

<tr>

  <td class="center">
<?php echo vypisSmajly($t_smajly,$g_smajly); ?>
  </td>
</tr>

  
  <td class="center">
<a href="javascript:replace('b');" title="Formátovací značky pro tučný text" class="gbsmall" name="b">TUČNĚ</a>&nbsp;&#124;
<a href="javascript:replace('i');" title="Formátovací značky pro kurzívu" class="gbsmall" name="i">KURZÍVA</a>&nbsp;&#124;
<a href="javascript:replace('u');" title="Formátovací značky pro podtržený text" class="gbsmall" name="u">PODTRŽENÉ</a>
<div style="font-size: 11px;">text napište mezi tagy v hranatých závorkách</div>

  </td> <tr>
  
  <td class="center">
<input type="submit" value=" Odeslat " onclick="setCookie('<?php echo $config["gbook"]["cookie_expire"]; ?>');" /> 
<input type="reset" value="Vymazat" />
<input type="button" onclick="javascript:location.reload();" value=" Obnovit " /> 
</td>
</tr>
</table>



</form>

Zpracování formuláře:

<?php
switch ($_POST['action']){
  case 'edit':	//Úprava příspěvku
    if($loggeduser){	//Ověří uživatele při úpravě příspěvku
	  if(is_numeric($_POST['id'])){
        $mess->GetOne($_POST['id']);	//Načte upravovaný příspěvek z databáze
        $page = $_POST['page'];
        $q = $_POST['q'];
        $action = 'update" />'.$nl.'<input type="hidden" name="id" value="'.$_POST['id'];
        $add = 1;						//Zobrazí formulář z vyplněnými daty
        $name = $mess->name;
        $mail = $mess->mail;
        $web = $mess->web;
        $message = unCensore($mess->message);
      } else {
        echo '<h2 class="false">Nešlo upravit příspěvek</h2>Nejsi hacker?'.$nl;
        break;
      }
    }
    break;

  case 'delete':	//Vymazání příspěvku
    if($loggeduser){
      if($mess->Delete($_POST['id'])){
        echo '<h2 class="true">Příspěvek byl vymazán.</h2>'.$nl;
      } else {
        echo '<h2 class="false">Příspěvek nebyl vymazán!</h2>'.$nl;
      }
    }
    break;

  case 'insert':	//Přidání příspěvku
    $mess->name = trimSlash($_POST['name']);	//Získání údajů
    $mess->mail = trimSlash($_POST['mail']);
    $mess->web = trimSlash($_POST['web']);
    $mess->message = $_POST['message'];
    $exist = $mess->Get(0,$show,$mess->name);

    if($mess->message != '' && $mess->name != ''){	//Jsou vyplněny povinné položky
    if($loggeduser){	//Je přihlášen uživatel:
      if($_SESSION['permission'] != 'Master'){	//Pokud není přihlášen Master, příspěvek se zkrátí :)
          //Pokud příspěvek již existuje, znovu se nepřidá
          if(in_array(Censore($mess->message,$config['gbook']['message_max_r']),mysql_fetch_array($exist))) {echo '<h2 class="false">1Příspěvek již existuje</h2>'.$nl; break;}
        $mess->message = Censore($mess->message,$config['gbook']['message_max_r']);
       } else {
          //Pokud příspěvek již existuje, znovu se nepřidá
         if(in_array(CensoreLite($mess->message),mysql_fetch_array($exist))) {echo '<h2 class="false">2Příspěvek již existuje</h2>'.$nl; break;}
         $mess->message = CensoreLite($mess->message);	//Pouze se zalomí řádky
        }

        if($mess->Insert()){	//Vložení příspěvku
          echo '<h2 class="true">Příspěvek byl přidán.</h2>'.$nl;
        } else {
          echo '<h2 class="false">Příspěvek nebyl přidán!</h2>'.$nl;
        }
      } else {	//Není přihlášen uživatel:
        $user = new User;
        @$user->GetOne($mess->name);	//Ověření, zda uživatel již neexistuje v databázi
        if($user->count == 0){	//Uživatel v databázi neexistuje

		    //Pokud příspěvek již existuje, znovu se nepřidá
         if(in_array(Censore($mess->message,$config['gbook']['message_max']),mysql_fetch_array($exist))) {echo '<h2 class="false">3Příspěvek již existuje</h2>'.$nl; break;}
            $mess->message = Censore($mess->message,$config['gbook']['message_max']);	//Zkrácení příspěvku
            if($mess->Insert()){	//Vložení příspěvku
              echo '<h2 class="true">Příspěvek byl přidán.</h2>'.$nl;
            } else {
              echo '<h2 class="false">Příspěvek nebyl přidán!</h2>'.$nl;
            }
          
        } else {	//Uživatel v databázi existuje:
          echo '<h2 class="false">Uživatel <b>'.$mess->name.'</b> je zaregistrován</h2>'.$nl;
          echo '<a href="login.php" title="Přihlásit se" class="gbsmall">Přihlaste se</a> nebo změňte jméno!<br /><br />'.$nl;
		  $name = '&lt;zadejte jiné jméno&gt;" onclick="javascript:this.value=\'\';';
          $show_data = true;	//Opět vypsat data do formuláře
        }
      }
    } else {	//Nejsou vyplněny povinné položky
      echo '<h2 class="false">Nejsou vyplněny povinné položky</h2>'.$nl;
      $show_data = true;
    }
    if($show_data){	//Vypíše data do formuláře
      $add = 1;
      $mail = $mess->mail;
      $web = $mess->web;
      $message = $mess->message;
    }      
    
  break;

  case 'update':	//Upravení příspěvku
    if($loggeduser && (($_SESSION['name'] == $_POST['name']) || $_SESSION['permission'] == 'Master')){
      $mess->GetOne(trimSlash($_POST['id']));
      $oldmessage = $mess->message;				//Získá původní příspěvek
      $mess->mail = trimSlash($_POST['mail']);
      $mess->web = trimSlash($_POST['web']);
      $mess->message = $_POST['message'];
      if($_SESSION['permission'] != 'Master'){	//Pokud není přihlášen Master, příspěvek se ocenzuruje :)
        $mess->message = Censore($mess->message,$config['gbook']['message_max_r']);
        $mess->message .= "<br /><br /><b>Původní zpráva:</b><br /><i>".$oldmessage."</i>";
      } else {
        $mess->message = CensoreLite($mess->message);	//Pouze se zalomí řádky
      }
      if(is_numeric($_POST['id'])){
        if($mess->Update($_POST['id'])){
          echo '<h2 class="true">Příspěvek byl upraven.</h2>'.$nl;
        } else {
          echo '<h2 class="false">Příspěvek nebyl upraven!</h2>'.$nl;
        }
      } else {
        echo '<h2 class="false">Nešlo upravit příspěvek</h2>Nejsi hacker?'.$nl;
        break;
      }
    }
    break;      
}
?>
Nahlásit jako SPAM
IP: 212.79.106.–
Kit+15
Guru
25. 9. 2019   #2
-
0
-

#1 Jarda
Po každém připojení musíš databázi sdělit, jakou znakovou sadu budeš používat. Slouží k tomu SQL dotaz 

SET NAMES cp1250;

Čím dříve však přejdeš na utf8, tím lépe.

Nahlásit jako SPAM
IP: 46.135.93.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jarda
~ Anonymní uživatel
199 příspěvků
25. 9. 2019   #3
-
0
-

Děkuji za reakci. Do stránky diskusního fóra mám includovaný následující script kde je ošetřené i kódování ale i přesto to nefunguje.

<?php
$dbserver = "";
$dblogin = "";
$dbheslo = "";
$dbnazev = "";


$db = mysql_connect($dbserver, $dblogin, $dbheslo);
mysql_select_db($dbnazev, $db);
mysql_query("SET NAMES 'cp1250'");
?>
Nahlásit jako SPAM
IP: 212.79.106.–
MilanL+1
Grafoman
26. 9. 2019   #4
-
0
-

#2 Kit
Neměl by to navzájem konvertovat -  utf8 na CP1250 a obráceně podle činnosti kterou provádí?

Nahlásit jako SPAM
IP: 91.139.9.–
Kit+15
Guru
26. 9. 2019   #5
-
0
-

#4 MilanL
Je to možné, s cp1250 jsem už nedělal docela dlouho. V těch převodech se dá snadno ztratit, zejména pokud někdo míchá HTML a SQL dohromady. Špagety už nefrčí.

Také netuším, proč všichni cpou ty apostrofy kolem cp1250 nebo utf8. Nepatří tam, viz dokumentace.

Zároveň by bylo vhodné přejít na PHP7, protože starší verze už moc dlouho podporovány nebudou.

Nahlásit jako SPAM
IP: 46.135.93.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jarda
~ Anonymní uživatel
199 příspěvků
27. 9. 2019   #6
-
0
-

Zkusil jsem překopat databázi i kódování na webu na UTF8 a bohužel problém přetrvává :-(.

Dump proměnných vyhodil toto:

 Text příspěvku neobsahuje diakritiku:

object(Message)#1 (15) { ["table"]=> string(7) "diskuse" ["db"]=> resource(13) of type (mysql link persistent) ["count"]=> int(2264) ["id"]=> NULL ["name"]=> string(5) "Jarda" ["mail"]=> string(0) "" ["web"]=> string(0) "" ["message"]=> string(4) "test" ["date"]=> string(19) "2019-09-27 20:40:43"

Text příspěvku s diakritikou:

object(Message)#1 (15) { ["table"]=> string(7) "diskuse" ["db"]=> resource(13) of type (mysql link persistent) ["count"]=> int(2265) ["id"]=> NULL ["name"]=> string(5) "Jarda" ["mail"]=> string(0) "" ["web"]=> string(0) "" ["message"]=> string(9) "test ščřž" ["date"]=> NULL
Nahlásit jako SPAM
IP: 212.79.106.–
Jarda
~ Anonymní uživatel
199 příspěvků
27. 9. 2019   #7
-
0
-

Tak problém byl v tomto řádku. Proč ale neprošla diakritika mi jasné není.

 if(in_array(Censore($mess->message,$config['gbook']['message_max']),mysql_fetch_array($exist))) {echo '<h2 class="false">3Příspěvek již existuje</h2>'.$nl; break;}
            $mess->message = Censore($mess->message,$config['gbook']['message_max']);	//Zkrácení příspěvku
Nahlásit jako SPAM
IP: 212.79.106.–
Kit+15
Guru
27. 9. 2019   #8
-
0
-

#7 Jarda
Filtrování výstupu funkcí htmlspecialchars() za tebe bude dělat kdo?

Nahlásit jako SPAM
IP: 46.135.88.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jarda
~ Anonymní uživatel
199 příspěvků
27. 9. 2019   #9
-
0
-

Vypadá to že htmlspecialchars jaksi vyšoupne i diakritiku :-/

  if((strlen($message) > $max) && ($max != '')){
   $message = 'Tento příspěvek přesáhl '.$max.' znaků, proto byl zkrácen!'.substr(htmlspecialchars($message, ENT_QUOTES), 0, $max).'...';
  } else {
    $message = htmlspecialchars($message, ENT_QUOTES);
  }
Nahlásit jako SPAM
IP: 212.79.106.–
Kit+15
Guru
28. 9. 2019   #10
-
0
-

#9 Jarda
Hlavním důvodem je, že dosud nemáš sjednocena kódování, resp. nemáš zvládnuty konverze mezi nimi. Pokud budeš mít všechno (včetně zdrojáku) v UTF-8, problémy odpadnou.

Je dobré si uvědomit, že při zpracování POST bys neměl generovat žádný výstup, ale jen udělat přesměrování HTTP 302, jinak ti uživatel kliknutím na tlačítko back udělá zmatek v datech.

Zkus si někde přečíst, jak se vyhnout špagetovému kódu, protože v tom tvém se ty chyby hledají docela blbě. Aspoň to rozděl do samostatných funkcí, ať je můžeš zkoušet nezávisle na sobě. Příkaz echo v nich však nepoužívej, vracej string returnem.

Nahlásit jako SPAM
IP: 46.135.88.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jarda
~ Anonymní uživatel
199 příspěvků
29. 9. 2019   #11
-
0
-

Děkuji za rady, ale šlo především o to, že v novější verzi PHP došlo ke změně defaultního nastavení kódování funkce htmlspecialchar.

Pokud by někdo měl stejný problém je třeba definovat kódování přímo takto: 

   $message = htmlspecialchars($message, ENT_QUOTES,'ISO-8859-1');
Nahlásit jako SPAM
IP: 212.79.106.–
Kit+15
Guru
30. 9. 2019   #12
-
0
-

#11 Jarda
To sis nevybral nejvhodnější kódování. Zkus znaky žšť.

Na UTF-8 stejně jednou přejdeš. Raději to udělej hned, budeš s tím mít méně práce.

Nahlásit jako SPAM
IP: 46.135.71.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 62 hostů

Podobná vlákna

E-mail se neodešle — založil Tase

Diakritika — založil peter

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý