Autor Zpráva
leorond
Profil
Dobrý večer, chtěl bych se zeptat na něco ohledně MySQL databáze a _utf8, jsem zvyklí na MSSQL databázi v které pracuji již dlouho ale ted bych potřeboval udělat instalaci MySQL databáze pomocí php scriptu. Není to nic těžkého a vše funguje jak má.

Když chci udělat input do DB s diakritikou, například takto
mysql_query("INSERT INTO tabulka (id,text) values ('1','test ěščřžýáíé')") or print ("Již se zapsalo do DB");

Tak výsledek je takový že se do DB zapíše pouze část textu bez diakritiky a ostatní se ustřihne.

Případně když použiji kódování _utf8 při zápisu do DB tak se do databáze zapíše text stejně jako je vložen ale jak ošetřit výstup aby se neukazovalo jen "??????".
Děkuji za odpověd.
juriad
Profil
Diskuse JPW: Některé časteji řešené dotazy pro MySQL - FAQ » MySQL a čeština. Stačí jako první příkaz po připojení nastavit správné kódování.

Mimochodem, funkce rodiny mysql_* jsou zavržené a budou za nedlouho odstraněné, pro nové priojekty použij mysqli_* (liší se jen drobnostmi jako je povinný argument navíc).
leorond
Profil
Ještě bych potřeboval v tomto scriptu udělat kontrolu zda je vybrán soubor. Nebo nahodit na správnou cestu :)

<?php
if(isset($_FILES['files'])){
    $errors= array();
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
        $file_name = $key.$_FILES['files']['name'][$key];
        $file_size =$_FILES['files']['size'][$key];
        $file_tmp =$_FILES['files']['tmp_name'][$key];
        $file_type=$_FILES['files']['type'][$key];    
        if($file_size > 2097152){
            $errors[]='File size must be less than 2 MB';
        }        
        $query="INSERT into upload_foto_1 (`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`) VALUES('$file_name','$file_size','$file_type'); ";
        $desired_dir= "galerie/".$test_db_1["user"];
        if(empty($errors)==true){
            if(is_dir($desired_dir)==false){
                mkdir("$desired_dir", 0700);        // Create directory if it does not exist
            }
            if(is_dir("$desired_dir/".$file_name)==false){
                move_uploaded_file($file_tmp,"galerie/".$test_db_1["user"]."/".$file_name);
            }else{                                    //rename the file if another one exist
                $new_dir="galerie/".$test_db_1["user"]."/".$file_name.time();
                 rename($file_tmp,$new_dir) ;                
            }
            mysql_query($query);            
        }else{
                print_r($errors);
        }
    }
    if(empty($error)){
        echo "Success";
    }
}
?>


<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="files[]" />
    <input type="submit"/>
</form>

Script funguje perfektně ale pokud stisknu tlačítko -> funguje

Děkuji


juriad to znamená učit se zase něco nového? :-D Super :-)

Nemáš prosím někde nějaký článek o MySQLi?


Vlastně takový příklad zápisu MySQLi mohl by vypadat takto?

mysqli->query("SELECT * FROM tabulka");
juriad
Profil
leorond:
A tu kontrolu chceš na klientovi v prohlížeči? Pak stačí přidat atribut required k inputu (není to stoprocentní, ale kontrolu stejně vždy musíš provádě i na serveru - tam stačí ve smyčce spočítat počet úspěšně nahraných souborů a podle toho se zařídit). Nezapomínej na to, že po POSTovém requestu musíš přesměrovat, viz en.wikipedia.org/wiki/Post/Redirect/Get.

Ten rozdíl je opravdu nepatrný - www.fisir.tk/itblog/mysql_



Umíš-li s objekty, tak ano, jinak mysqli_* má i procedurální API, v dokumentaci je vždy zmíněno.
Pozor také na SQL Injection - nevěř uživateli ani nos mezi očima, natož že název soboru nebude obsahovat znaky jako je apostrof. Všechny řetězce, které vkládáš do SQL dotazu musíš escapovat.

A když už začínáš s MySQL, můžeš se také podívat na knihovnu dibi, která je příjemnější na používání.
leorond
Profil
To kódování by stačilo nějak takto?

function connect() {
  mysql_connect("server", "user", "pass");  //pripojime k serveru
  mysql_select_db("db");                               //vybereme databazi
  mysql_set_charset("utf8"); 
}

Ano required mne také napadl, nemohu to pustit až k SUCCESS pokud nechci aby se to zapsalo do databáze a nahrál se obrázek na server.
Myslel jsem přidat něco jako
elseif    ($_FILES['files']     <    1)    echo    "Nebyl vybrán soubor";



Co se týká
dibi, mysql, mysqli vše mi to přijde skoro stejné, jen mne mrzí že to neumí vše jako mssql protože to by byla bomba :)
juriad
Profil
leorond:
Tam je problém, ty nechceš kontrolovat, zda uživatel vybral nějaký soubor. Ale že vybral alespoň jeden a že ten jeden splňuje požadavky.

Přidej tedy za 3. řádek $uploaded_files = 0; a za mysql_query přidej $uploaded_files++; a do podmínky na 29. řadku přidej && $uploaded_files > 0. Možná bys mohl po úspěšném uploadu za mysql_query provést break, ať se vloží maximálně jeden soubor a ne víc.

Ano, takto by mělo stačit nastavit to kódování.

Co ti u těch knihoven chybí? Třeba to umí a tys to jen nenašel...
leorond
Profil
No vše je defakto stejné ale přechod na MySQL byl pro mne něco nového, hlavně v trošku jiných příkazech na DB jako je změna mssql_query("select top 10... na mysql_query("...limit 10");. Ale pravda je že pravděpodobně je jen jiná forma zápisu nebo je třeba udělat funkci která poslouží stejně dobře, v php jde prostě skoro vše :).
juriad
Profil
leorond:
Zrovna omezení počtu vrácených záznamů ve stadardu tuším není. Proto si to každá databáze řeší po svém. Toto není věc knihoven, ale samotného dialektu SQL. Časem přijdeš i na další odlišnosti. MySQL je taková příjemná v tom, že ji vytvořili lidi pro sebe, hodně toho snese (třeba v GROUP BY je hodně benevolentní), má užitečné klauzule IF EXIST, není potřeba karakiri s IF OBJECT_ID('dbo.JMENO', 'U') IS NOT NULL DROP TABLE dbo.JMENO, ale má i spoustu much.
leorond
Profil
No popravdě jsem celkem úspěšně použil několik scriptu z mého webu pro mssql, sice jsem musel přidat mysql_real_escape_string a udělat několik úprav pro připojení k DB ale jinak vše OK.


Nevím proč mi to stále nechce fungovat a jde to až do databáze. Vše jsem udělal jak jsi řekl a stejně to na mne háže ignor :D a to těžkej :D

Ale dostal jsem lepší nápad co když dodám omezení na velikost a upravím podmínku na 9. řádku asi takto

if(($file_size > 2097152)  | ($file_size < 1)){
            $errors[]='Soubor nebyl vybrán nebo má více než 2MB!';
        }        

to by mohlo fungovat jako ochrana ne?


Vím jak udělat ochranu před výpisem článků bez obrázku v DB ale zde když vložím podmínku která určuje minimální velikost obrázku tak dostanu chybovou hlášku a hned za ní success
mimochodec
Profil
Ty roury dvě.
lionel messi
Profil
Správne musí byť podmienka zapísaná takto:

if(($file_size > 2097152)  || ($file_size < 1)){

Operátor | znamená bitové alebo, ty potrebuješ logické.

Pardon, v podstate som len ukecanejšou podobou zopakoval mimochodcov príspevok, ktorý som prehliadol.
leorond
Profil
Děkuji za radu mimochodec ale vymyslel jsem to jinak, proč určovat velikost nebo kontrolovat počet souborů? Udělal jsem to takto

    elseif (strlen ($file_name) < 1)
        {
            echo "Ouha!";
        }

vím že je to amatérské ale ani název by neměl být menší než než 1 znak :D
funguje 100%.

Jen mi přibliž co jsi myslel těmi rourami? :)


lionel 2 roury nefungují


To mě podržte :D fungovalo to jen 2x a teď zase úspěšně uploaduju :D


Pánové zkusil jsem skoro všechno a popravdě jsem nedosáhl úspěchu. Pomozte mi nějak přidat podmínku po minimální velikost, minimální počet souborů nebo minimální počet znaků v názvu obrázku. Děkuji za pomoc


Ok 10x jsem to otestoval a mělo by to být OK

    elseif(($file_size > 2097152)  || ($file_size < 1))

Pomohlo, jen jsem to trochu upravil a uložil na správné místo.
mimochodec
Profil
Mně se trochu líp než || a && pamatuje a píše or a and.
leorond
Profil
Mne taky ale jelikož jsem chtěl ke každému obrázku přidat nadpis, text, podpis a datum tak jsem script trochu vylepšil a mám z toho perfektní systém na přidávání novinek pro web. :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0