Autor Zpráva
Va-zo
Profil *
Zdravím,
mám problémy s Ajaxem, konkrétně s češtinou. Jsem začátečník, co se týče Ajaxu a zkoušel jsem upravovat jeden zdroják chatu, ale nějak se mi nedaří, aby se do databáze ukládaly české znaky. Přikládám zdrojáky a předem děkuji za vaše rady.

ajax.js
	subject_id = '';
	function handleHttpResponse() {
		if (http.readyState == 4) {
			if (subject_id != '') {
				document.getElementById(subject_id).innerHTML = document.getElementById(subject_id).innerHTML+http.responseText;
			}
		}
	}
	function getHTTPObject() {
		var xmlhttp;
		/*@cc_on
		@if (@_jscript_version >= 5)
			try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (E) {
					alert('Error while creating ActiveX object');
					xmlhttp = false;
				}
			}
		@else
		xmlhttp = false;
		@end @*/
		if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
			try {
				xmlhttp = new XMLHttpRequest();
			} catch (e) {
				alert('Error while creating XMLHttp Request object');
				xmlhttp = false;
			}
		}
		return xmlhttp;
	}
	var http = getHTTPObject(); // We create the HTTP Object


function.js
function show_smilies(sender)
{
	if(sender)
	{
	  var getStyle = document.getElementById('tools').style.visibility;
	  if(getStyle == "visible")
		document.getElementById('tools').style.visibility = "hidden";
	  else
		document.getElementById('tools').style.visibility = "visible";
	}
	else
	{
		document.getElementById('tools').style.visibility = "hidden";
	}

}
function add_code(code)
{
  document.getElementById('text_content').value = document.getElementById('text_content').value + code;
  show_smilies();

  document.getElementById('smilie').value = code;
  document.getElementById('smilie').value = code;
}
function get_message(div_id,sender)
{
    setInterval ("get_new_message('"+div_id+"',"+sender+")", 1500 );  
}
function send_message(div_id,content_id,sender)
{
	myDate1 = new Date(); 
    timestamp1 = myDate1.getTime();
	subject_id = div_id;
	content = document.getElementById(content_id).value;
	if(content.length)
	{
		document.getElementById(content_id).value = "";
		document.getElementById(content_id).focus();
		http.open("GET", "script_page.php?user="+sender+"&set=1&t="+timestamp1+"&content=" + escape(content), true);
		http.onreadystatechange = handleHttpResponse;
		http.send(null);
	}
}	
function get_new_message(div_id,sender)
{
	myDate = new Date(); 
	timestamp = myDate.getTime();
	subject_id = div_id;
    http.open("GET", "script_page.php?user="+sender+"&get=1&t="+timestamp+"", true);
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}


script_page.php
<?php
	session_start();	
 	Ob_start();
 	include('./conn.php');
	header('Content-Type: text/html; charset=windows-1250'); 
	
	
	if(isset($_GET['set']))
	{
  	   if(isset($_GET['content']))
		{
			//$str_msg = stripslashes($_POST['pripominky']);
			
		   $str_msg = stripslashes($_GET['content']);		   
		 		   
		   $time = Date("d.m.Y H:i:s", Time());
		   $time2 = Date("Y-m-d H:i:s", Time());   
		   
		   $str_msg = add_smilies($str_msg);
		   $t_stamp = $time;

		   $user = $_SESSION['JMENO'];
		   
		   ($_GET['uid']=='1')? $color ="red" : $color ="green";
		   
		    $insert1 = "INSERT INTO chat (user,msg,timestamp,displayed)
					 VALUES ('".$_SESSION['JMENO']."', '".addslashes($str_msg)."', '$time2', '0')";
		   mysql_query($insert1);
		   
		   echo "<br><font color=$color><b>".$user." </b>[".$t_stamp."] <b>: </b></font>".$str_msg;
		}
	}
	else if(isset($_GET['get']))
	{ 
		if($_GET['uid']=='1')
		{
			$uid = "2";
			$color  = "green";
		}
		else
		{
			$uid = "1";
			$color  = "red";
		}
     	   $get = "select * from chat where user= ".$uid." and displayed=0 ORDER BY timestamp DESC";	
  	       $res = mysql_query($get);
		   $num_rows = mysql_num_rows($res);
		   if($num_rows)
			{
			   while($new_msg = mysql_fetch_array($res))
				    echo "<br><font color=\"$color\"><b>User ".$user." </b>[".$new_msg['timestamp']."] <b>: </b></font>".stripslashes($new_msg['msg']);
			   $mark2 = mysql_query("update chat set displayed=1 where user=".$uid." and displayed=0");	
			}
		
	}
	else
	{
		echo "<font color=red><b><br>Chyba při zpracování dat...!</b></font>";
	}

function add_smilies($str_msg)
{
 $get_smiles = mysql_query("select * from smilies order by length(image_code) desc");
  while($row_smilies = mysql_fetch_array($get_smiles))
  {
    $str_msg = str_replace(''.$row_smilies['image_code'].''," <img src='./images/".$row_smilies['id'].".gif'> ",$str_msg);
	
	//$str_msg = preg_match("/".$row_smilies['image_code']."/","<img src='./images/".$row_smilies['id'].".gif'>");
	/*if(false !== strpos($row_smilies['image_code'],$str_msg))
	  {
		$sel = mysql_query("select * from smilies where image_code='".$row_smilies['image_code']."'");
		$row = mysql_fetch_array($sel);		
		echo "<img src='./images/".$row_smilies['id'].".gif'>";
	  }*/

  }
  return $str_msg;
}

?>


index1.php
<?php

session_start();
Ob_start();
include('./conn.php');
header('Content-Type: text/html; charset=windows-1250');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>SDH Nahořany - CHAT</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1250" />
<meta http-equiv='Content-language' content='cs' >
<script type="text/javascript" src="./ajax.js"></script>
<script type="text/javascript" src="./functions.js"></script>
<script type="text/javascript">
</script>
<link href="./styles.css" rel="stylesheet" type="text/css"></link>
<script language="JavaScript">
<!--
if (document.layers)
document.captureEvents(Event.KEYDOWN);
document.onkeydown =
function (evt) {
var keyCode = evt ? (evt.which ? evt.which : evt.keyCode) : event.keyCode;
if (keyCode == 13)
{
send_message('output_div','text_content','1');
}
}
//-->
</script>
<?php
if ($_SESSION['JMENO'] == ""){
$user = "Uživatel nepřihlášen!";
}else{
$user = $_SESSION['JMENO'];
}
?>
</head>
<body onload="get_message('output_div','1')">
<center>
<div class="body-holder">
<div class="window">
<table cellspacing="0" cellpadding="0" border="0">
<tr>
<td><img src='./images/header_01.jpg' height="34"></td>
<td background="./images/header_02.jpg" >
<img src="./images/1.gif" border="0" >
</td>
<td background="./images/header_02.jpg" width="100%">
<div id="window_title">&nbsp; Uživatel chatu: [<?php echo $user; ?>]</div>
</td>
<td background="./images/header_02.jpg" >
<?php /*<img src="./images/tipclose.gif" width="20" height="15" onclick="javascript:window.opener='x';window.close();";"> */ ?>
</td>
<td><img src='./images/header_03.jpg'></td>
</tr>
</table>
</div>
<div id="tools">
<?php
$res_smilies = mysql_query("select * from smilies");
$count = 0;
echo "<table cellspacing=1 border=0 cellpadding=1>\n<tr>";
while($row_smilies = mysql_fetch_array($res_smilies))
{
if($count == 4)
{
echo "</tr><tr>";
$count=0;
}
echo "\n<td align='center' width='35'>\n <a href='#' alt='".$row_smilies['image_code']."' onclick=\"add_code('".($row_smilies['image_code'])."');\" border=\
Va-zo
Profil *
Nevím proč, ale soubor index1.php se bezobrazil celý,takže doplňuji zbytek kódu:
echo "\n<td align='center' width='35'>\n <a href='#' alt='".$row_smilies['image_code']."' onclick=\"add_code('".($row_smilies['image_code'])."');\" border=\"0\"><img src=\"./images/".$row_smilies['id'].".gif\" border=\"0\"></a>\n</td>";
			$count ++;
		}
		echo "</table>";
	  ?>
	 </div>
     <div class="main_container">
		<div class="output-div-container">
		   <div id="output_div" onclick="show_smilies()">
		   </div>
		</div>
		<table border="0" width="504" class="tool_table">
		 <tr>
		  <td width="20"><a href="#" onclick="show_smilies('tool')"><img src="./images/1.gif" border="0"></a></td>
	      <td></td>	
		 </tr>
		</table>
		<div class="input-div">
		
		   <textarea name="zprava" type="text" id="text_content" onclick="show_smilies()" size="40" ></textarea>
		   <input type="submit" value="Poslat" onclick="send_message('output_div','text_content','1')">		
		   
		</div>
	</div>
	</div>
 </center>
 <?php
	ob_end_flush();
	?> 
</body>
</html>
Anicka
Profil *
V html máš podle výše uvedených zdrojáků kódování Windows-1250. Jaké kódování máš nastavené v DB?
Kajman_
Profil *
Místo escape bych použil encodeURI a v ukládacím skriptu pak očekával data v UTF8.
Va-zo
Profil *
To Anicka: No v DB mám nastaveno kódování na Czech iso-8859-2. Ale kódování DB nemůžu měnit!!! :-( Nejsem jedinej, kdo využívá tuto databázi.

To Kajman_: Takže když změním escape na encodeURI, tak budu ukládat zprávy do DB v UTF8? Jestli ano, tak to bych pak musel buď nastavit html kódování na UTF8, nebo převést UTF8 (pomocí php) na Windows-1250, že jo?
peta
Profil
Va-zo
Priste bych doporucoval udelat jednoduchy testovaci programek.

Zkus si zapnout v php error_reporting. Obavam se, ze funkce header bude ignorovana, protoze header uz byla uzavrena predchozi funkci. Tudiz ti server vraci data v default kodovani.

Pak bych si zkusil udelat primy odkaz na posilany soubor a ten zobrazit na obrazovku. At vidis, jake tam mas kodovani a jaky je jeho obsah
<a href="script_page.php?user="+sender+"&set=1&t="+timestamp1+"&content=" + escape(content)">klikni na mne</a>
Kajman_
Profil *
Va-zo:
Buď budete vkládat v utf8 a databázi to před insertem řeknete přes set names. Nebo si tu proměnnou převedete do cp1250 přes funkci iconv.
Va-zo
Profil *
No tak jsem proměnou, kam se ukládá obsah zprávy převedl:
$str_msg = iconv("UTF-8", "ISO-8859-2", $str_msg); 

Ale stejnak, když zapíší např. "č", tak se mi do databáze zapíše toto: %u010D
:-(
Chamurappi
Profil
Reaguji na Va-za:
Prosím o odkaz na živou ukázku.
Va-zo
Profil *
Odkaz
Chamurappi
Profil
Reaguji na Va-za:
Za procenta skutečně může funkce escape v JavaScriptu. Použij místo ní encodeURIComponent. Vstup budeš muset převést z UTF-8.

Před jistou dobou jsem si vyráběl vlastní variantu encodeURIComponent, která uměla kódovat do ISO-8859-2, možná bych ji dokázal upravit.
Va-zo
Profil *
Změnil jsem funkci escape na encodeURIComponent a v php měním UTF-8 na ISO-8859-2, ale stále nic. :-(
Chamurappi
Profil
Reaguji na Va-za:
v php měním UTF-8 na ISO-8859-2
Na server to nyní doputuje správně.
Stačí tedy zařídit, aby i odpověď ze serveru byla zobrazená správně. V té odpovědi bys měl buď překódovat ISO-8859-2 do windows-1250, nebo nastavit „Content-Type: text/html; charset=iso-8859-2“.
Va-zo
Profil *
Content-Type: text/html; charset=iso-8859-2 mám takto již nastavenej, ale v databázi se pořád neukládají české znaky.
Va-zo
Profil *
Tak už to funguje, akorát "š" a "ž" se zobrazují špatně (zobrazují se jako: " ą " a " ľ ")! Nevíte čím by to ještě mohlo být? Jinak všem moc děkuju za pomoc.
Chamurappi
Profil
Reaguji na Va-za:
mám takto již nastavenej
Nemáš. Odpověď ze serveru má pořád v hlavičce charset=windows-1250.

Koukám, že jsi změnil <meta> značku uvnitř stránky. Tu můžeš zase vrátit zpátky.
Va-zo
Profil *
Mám ještě jednu prosbičku....Poraďte pls, potřebuju, aby když napíšu nějakej příspěvek, tak aby se vložil na stránce na první místo a ne na poslední.
Chamurappi
Profil
Reaguji na Va-za:
Viz řádek 5 v ajax.js. Když se zamyslíš, co dělá, mohlo by tě napadnout, jak ho upravit.
Va-zo
Profil *
No tak to bude takhle:
document.getElementById(subject_id).innerHTML = http.responseText + document.getElementById(subject_id).innerHTML;

Dík! Včera mě to už nemyslelo a taky jsem v tom hledal nějakou větší složitost, přeci jen se s Ajaxem teprve učím.

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: