joi, septembrie 25, 2008

Problema Diacriticilor sau cum sa Internationalizam site-urile in php

Des întălnesc site-uri unde exista problemă de afișare a diacriticilor Ă,Î,Ș,Ț,Â. Sau probleme în afișarea a diferitor limibi in paralel pe aceași pagină web.

În continuare va propun o soluție la aceasta problema pentru site-uri scrise in php care folosesc MySQL ca baza de date pentru a stoca informatia de pe site.

Este necesar ca:
SERVER Connection Collation sa fie egal cu utf8_general_ci (vezi in setari la server)
DATABASE CHARACTER SET sa fie egal cu UTF8
Database Collation sa fie egala cu utf8_general_ci

Vezi mai jos schema bazei de date

--
-- Baza de date: `dbtest`
--
CREATE DATABASE `dbtest` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `dbtest`;
--
-- Structura de tabel pentru tabelul `tbtest`
--
CREATE TABLE IF NOT EXISTS `tbtest`
( `id` int(11) NOT NULL,
`text` varchar(1000) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Pentru afisarea datelor din baza de date in pagina php ne conducem dupa exemplul urmator:

<?php
header('Content-type: text/html; charset="utf-8"');
$link=mysql_connect (server, user, pass);
mysql_select_db(dbtest);

$charset = mysql_client_encoding($link);
mysql_query("SET CHARACTER SET 'utf8'", $link);


echo "<html>\n";
echo "<head>\n";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n";
echo "</head>\n";
echo "<body>\n";
echo "Setul de caractere curent este: $charset\n";

$sql = "select * from tbtest";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
echo $row["text"]."<br>\n";
}

echo "</body>\n";
echo "</html>\n";
?>

luni, septembrie 22, 2008

SELECT SUM(of varchar type) FROM ...

Recent m-am ciocnit de asa o problema: Aveam tabela Items cu structura urmatoare: id int,name varchar(100) unde valorile in cimpul id si respectiv name se repetau. Problema consta in a extrage lista de id-uri unicale unde name-ul sa constaie din suma de name-uri delimitate prin ",". Mai jos va propun o solutie:


CREATE FUNCTION getName (@latlng varchar(510) )
RETURNS varchar(4000)
AS
BEGIN
declare @t as varchar(2000)
--SET @latlng='48.2016667|27.4158333'
SET @t = ''

select top 4 @t = @t + ' ' + full_name_nd from geocode_md_unicode1 where fc='P' and lat+'|'+long=@latlng

return @t
END



select latlng,dbo.getName(latlng) as nume1 from (
select lat+'|'+long as latlng from geocode_md_unicode as t1 where fc='P'
group by lat+'|'+long) as t2

Membri

Comentarii