MySQL a binarni data

Karel Zak zakkr na zf.jcu.cz
Čtvrtek Prosinec 7 11:54:15 CET 2000


On Thu, 7 Dec 2000, Michal Krause wrote:

> >  Proc? Moc nechapu v cem mas problem. Pokud tam protlacis INSERT tak 
> > UPDATE je to same ne?
> 
> Ja tamale neprotlacim ani ten INSERT. Prece kdyz mam nejakou strukturu a

 Aha :-)

> v ni binarni data (treba ta cisla), nemuzu je nijak rozumne hodit do
> query, protoze by tam mohla byt nula. Jde to jedine prevodem na string,
> coz delam v podstate ted a chci se toho zbavit.
> 
> >  Uz je to par let co do zminovane SQL (ano i ja pouzivam MySQL:-)
> 
> Neuveritelne :)
> 
> >  ukladam binarni data z PHP bez vetsich problemu, pochopitelne, ze je
> >  nutne ta data nejak osetrit (napr. PHP - AddSlashes() apod.).
> 
> A co udela AddSlashes s takovymto polem bajtu:
> 
> 12 34 39 40 49 6 50 0 48 3 90 48 5 96

   string addslashes(string str);

   Returns a string with backslashes before characters that need to be
   quoted in database queries etc. These characters are single quote ('),
   double quote ("), backslash (\) and NUL (the null byte).

> >  Nebo muzes ty binarni data prevadet na ASCII nejakym lepsim zpusobem
> >  (base64, prevod na hexa apod.) - pokud na tom ASCII trvas :-)
> 
> Ja naopak vubec na ASCII netrvam, chci proste mit libovolna binarni
> data, treba obrazek (to sice neni zrovna ten muj pripad, ale pro
> demonstraci to staci). Dejme tomu, ze ho chci dostat do databaze ze
> sveho programu v C. Takze nactu do bufferu obsah souboru a potom udelam
> co? INSERT INTO table VALUES ('ten_muj_buffer_i_s_nulami') asi tezko :)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^
 Prevedes ten buffer na neco "nezavadneho".

 Chlape co se do toho PHP podivat:

char *php_addslashes(char *str, int length, int *new_length, int should_free)
{
	/* maximum string length, worst case situation */
	char *new_str = (char *) emalloc((length?length:(length=strlen(str)))*2+1);
	char *source,*target;
	char *end;
	char c;
	PLS_FETCH();

	for (source=str,end=source+length,target=new_str; (c = *source) || source<end; source++) {
		switch(c) {
			case '\0':
				*target++ = '\\';
				*target++ = '0';
				break;
			case '\'':
				if (PG(magic_quotes_sybase)) {
					*target++ = '\'';
					*target++ = '\'';
					break;
				}
				/* break is missing *intentionally* */
			case '\"':
			case '\\':
				if (!PG(magic_quotes_sybase)) {
					*target++ = '\\';
				}
				/* break is missing *intentionally* */
			default:
				*target++ = c;
				break;
		}
	}
	*target = 0;
	if (new_length) {
		*new_length = target - new_str;
	}
	if (should_free) {
		STR_FREE(str);
	}
	return new_str;
}

 Coz? ... mam u tebe pivo - dalo mi to cca 2min hledani :-)

				Karel





Další informace o konferenci Databases