Autor Zpráva
svadla
Profil
Zdravim,

nevim jestli je chyba mezi zidli a klavesnici, v mysql, nebo v php. Na localhostu vse funguje, na hostingu u onebit ne. Pokusim se nastinit problem:

Mam RS, ktery pri zmene udaju vygeneruje update
update fotografie_reference set reference_id = '1', nazev = 'kk', pohled = 'll', alt = 'ttttadads asd ad a ds' where id = '9'


mysql_error() nic nenapise.

Dotazem

select * from fotografie_reference


zjistim, ze se data upravila, hned potom uz mam jen die(). A problem je, kdyz zkontroluju data v phpmyadminu, tak je radek upraven, ale vsechny upravovane sloupce z update jsou prazdne.

dekuji

Pozn: pokud update "natvrdo" nahradim za
update fotografie_reference set reference_id = '1', nazev = 'kk', pohled = 'll', alt = 'ttttadads asd ad a ds' where id = '9'

tak data zustanou v db i po ukonceni skriptu.
tiso
Profil
svadla: aký je rozdiel tvojou prvou a treťou ukážkou?
svadla
Profil
tiso:
To je prave ono, zadny. Tu prvni mi generuje RS, posledni je napsano rucne.
tiso
Profil
svadla: poprosím ukážku kódu toho RS okolo tohto dotazu.
svadla
Profil
tiso:
bude to trochu slozitejsi, ale pokusim se ...

metoda, ktera provadi dotazy:
	function query($sql) {
		global $error;
		$sql = trim($sql);
if (eregi('^update', $sql)) $sql = "UPDATE `fotografie_reference` SET `reference_id`='1', `nazev`='kk', `pohled`='ll', `alt`='ttttadads asd ad a ds' WHERE `id`='9'";
echo $sql.'<br>';
		if ($result = mysql_query($sql)) {
if (eregi('^update', $sql)) die;
			if (substr(strtolower($sql), 0, 6) == "insert") return mysql_insert_id();
			else return ($result);
		} else {
			echo mysql_error();
			$error-> add('mysql',mysql_error(),$_SESSION["uzivatel_id"]);		
		}
	}

pokud odpoznamkuji ten jeden radek, tak je to ok, proto jsem myslel ze mu z RS posilam spatny dotaz. Proto je tam echo $sql

Zapoznamkovany radek (dotaz z RS) vypise
SET CHARACTER SET 'utf8'
SET NAMES utf8
UPDATE `fotografie_reference` SET `reference_id`='1', `nazev`='kk', `pohled`='ll', `alt`='ttttadads asd ad a ds' WHERE `id`='9'


Odpoznamovany radek (natvrdo dotaz) vypise
SET CHARACTER SET 'utf8'
SET NAMES utf8
UPDATE `fotografie_reference` SET `reference_id`='1', `nazev`='kk', `pohled`='ll', `alt`='ttttadads asd ad a ds' WHERE `id`='9'
svadla
Profil
Doplneni:
na serveru je
MySQL: 5.1.42
Verze MySQL klienta: mysqlnd 5.0.7-dev
PHP 5.3
svadla
Profil
Tak jsem zjednodusil kod a mam nazornejsi priklad:
PHP kod
$db = new Mysql();

if (is_array($_POST)) {
$table = 'fotografie_reference';
$id = '9';
  foreach($_POST as $k => $v){
    $data[] = str_replace("cms_", "", $k)." = '".$v."' ";
  }
$data = implode(", ", $data);
		$sql = "UPDATE ".$table." SET ".$data." WHERE `id`='".$id."' ";
  //$sql = "update fotografie_reference set reference_id = '".$_POST['cms_reference_id']."', nazev = '".$_POST['cms_nazev']."', pohled = '".$_POST['cms_pohled']."', alt = '".$_POST['cms_alt']."' where id = '".$_POST['aid']."'";
echo $sql;
$db->dotazuju($sql);
}


echo $sql vypise
UPDATE fotografie_reference SET nazev = 'Západ' , pohled = 'Západ' , alt = 'Západ' , reference_id = '1' WHERE `id`='9' 


ale do databaze se misto slova Zapad ulozi jen Z.

sloupce jsou varchar (250)
tiso
Profil
svadla: „ale do databaze se misto slova Zapad ulozi jen Z.
To vyzerá na nejaký problém s kódovaním…
svadla
Profil
tiso:
pravda, toto jsem vyresil (jen se mi nepovedlo namodelovat puvodni problem), ale puvodni problem porad trva
tiso
Profil
svadla: a ako vyzerá tá tabuľka fotografie_reference?
svadla
Profil
uz jsem z toho nestastnej ...

CREATE TABLE IF NOT EXISTS `fotografie_reference` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nazev` varchar(250) COLLATE utf8_czech_ci NOT NULL,
  `alt` varchar(250) COLLATE utf8_czech_ci NOT NULL,
  `pohled` varchar(250) COLLATE utf8_czech_ci NOT NULL,
  `reference_id` int(11) NOT NULL,
  `soubor` varchar(250) COLLATE utf8_czech_ci NOT NULL,
  `poradi` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=16 ;
tiso
Profil
svadla: netuším kde je problém, žiaden nevidím…
svadla
Profil
tiso:
diky za snahu, ja take ne

Kdyby to jeste nekdo cetl, tak jeste jednou priklad problemu:
- po kazdem dotazu se vypisou sloupce jednoho radku tabulky
- toto je vypis na obrazovku

// dotaz set character set ... zobrazi se
Array ( [id] => 9 [nazev] => [alt] => [pohled] => [reference_id] => 0 [soubor] => zapad.jpg [poradi] => 9 )
// dotaz set names ... zobrazi se
Array ( [id] => 9 [nazev] => [alt] => [pohled] => [reference_id] => 0 [soubor] => zapad.jpg [poradi] => 9 )
// nyni provedu update: UPDATE `fotografie_reference` SET reference_id=1, `nazev`='kk', `pohled`='ll', `alt`='ttttadads asd ad a ds' WHERE id=9, spravne se zobrazi stav ulozenych hodnot
Array ( [id] => 9 [nazev] => kk [alt] => ttttadads asd ad a ds [pohled] => ll [reference_id] => 1 [soubor] => zapad.jpg [poradi] => 9 )


problemem je, ze pri F5 se vypisuje stale to same, pritom by prvni vystup mel obsahovat jine hodnoty
svadla
Profil
Jeste tresnicka ... kdyz menim radek s ID 8, tak vse funguje.
Kajman_
Profil *
Není tam jiná aplikace, trigger nebo něco, co ten řádek upravuje také? Nemáte chybu spíše v objektu, který používáte?

Když spustíte dotaz poprvé, jaký údaj je v mysql_affected_rows? A při dalším spuštění?
svadla
Profil
Kajman:
zadna jina aplikace, nebo trigger co do tohlo mohlo zasahnout tam nebylo.

Jeste 27.9. jsem to zkousel a neslo to, tak jsem to nechal chvili vyhnit (abych se uklidnil) a dneska vse funguje tak jak ma. Jen je divne, ze pres phpmyadmin se mi ve vypisu dat zobrazuje nejaky divny hash ... napriklad misto slova "Západ" vidim "5ac3a1706164".
svadla
Profil
Tak jsem se trochu unahlil, jednou to funguje, jednou ne ...
Zapis ceskych znaku do DB byl jasny, nemel jsem nastaveny utf_czech.

Novy poznatek je, že chyba bude asi v PHP, protoze externim pripojenim na db z localhostu vse funguje.
Kajman_
Profil *
S hostingem jste chybu už konzultoval?
svadla
Profil
Kajman:

Snazim se. Pripravil jsem jim hezky priklad, uvidim kdy si najdou chvilku. Jinak mi zatim kluci z Onebitu vysli vstric.
svadla
Profil
Problém způsoboval doplněk YSlow 2.0.7 do mého Firefoxu 3.6.5. linux verze tím, že stránku refreshun na pozadí, bez poslaných POST údajů => tím se provedl update databáze, kde se vyplnili prázdné údaje. Je to i chyba aplikace, že toto chování dovolí.

Vyřešeno taky díky super podpoře Onebit.cz
Toto téma je uzamčeno. Odpověď nelze zaslat.

0