upload система идея

pro12

Registered
Това ми е кода за качване на 3 снимки едновременно.
HTML:
<form action="img.php" method="post" enctype="multipart/form-data">
  <p><input type="file" name="file_array[]"></p>
  <p><input type="file" name="file_array[]"></p>
  <p><input type="file" name="file_array[]"></p>
  <input type="submit" name="add" value="Upload all files">
</form>
Това ми е метода за проверка на формата на снимките и работи но искам да ги съкратя проверките.
PHP:
  public function check(){
        //check
        for($i = 0; $i < count($this->image['name']); $i++){

        $errors = [];
        $type = $this->image['type'];
        if ($this->image['type'][0]!= 'image/jpeg') {  
          $errors [] = 'Попълнете sss!';
        }
         if ($this->image['type'][1]!= 'image/jpeg') {  
          $errors [] = 'Попълнете sss1!';
        }
         if ($this->image['type'][2]!= 'image/jpeg') {  
          $errors [] = 'Попълнете sss2!';
        }
        if(count($errors) > 0)  
           throw new Exception(implode(', ', $errors), 5);  
        }         
    }
Ако проверката я направя така.
PHP:
if ($this->image['type'][$i]!= 'image/jpeg') {  
          $errors [] = 'невалиден формат!';
        }
Проблема е ,че ако проверката е така и кача по малко то 3 снимки ми дава че е невалиден формат. Ако някоя има по добра идея да пише!
 
Първо научи бейсика, после се захващай със хард частта. Хем ги слагаш в лууп, хем си забил стойностите ... няма как да съкратиш по този начин и нормално да не работи както трябва.

1. Сложи ги в foreach
2. прави проверка със isset за tmp_name - така ще знаеш, дали е избран файл
3. нормално ако няма избран файл в 3-тото инпутче и да ти каже, че формата ѝ не е jpeg ахха ;d

Ето семпъл код на структурата, ти ще си го преработиш.
Код:
	 foreach ($_FILES['file_array'] as $file)  //1
	 {
	 	 if(isset($file['tmp_name'])) //2
	 	 {
	 	 	  if(strstr($file['type'], 'image/')) // 3
	 	 	  {
	 	 	  	$errors[] = "ne e snimka"; //сърми
	 	 	  }
	 	 	  else 
	 	 	  	 {
	 	 	  	 	move_uploaded_file($file['tmp_name'], '/uploads/');	// upload
	 	 	  	 }
	 	 }
	 }

	 echo trim(implode($errors,', '),",");
:idea: :?:
 
Аз го направих така.
PHP:
public function count(){
        $ar = array();
     foreach ($this->image["name"] as $file =>$key)  //1
    {
        if(!empty($this->image["name"][$file])) //2
        {
             $ar ["name"] = $this->image["name"][$file];
             $ar ["type"] = $this->image["type"][$file];
           if ($ar["type"]!= 'image/jpeg') {  
      echo  'Попълнете sss2!';
        } else {            $r = implode(",", (array) $ar["name"]);

            require_once 'Dbase.php';
            $type = "ss";
         $params = ["$r"]; 
         $insert = Dbase::getInst();
         $insert->insert("zaqvka", "pic1, pic2", "?,?", "$type", $params); 
         
        }
        }
Искам да записвам снимките в една таблица в която имам 3 колони. Тоест в колона 1 да записва снимка1 и така и с др снимки. Как да го направя?
 
Това е кода ми.
PHP:
 $ar = array();
     foreach ($this->image["name"] as $file =>$key)  //1
    {
        if(!empty($this->image["name"][$file])) //2
        {
             $ar ["name"] = $this->image["name"][$file];
              $r = '"'. implode('', (array) $ar["name"] ).'"';
            echo  $r ;

        }
    }
При извеждане става така "снимка1""снимка2" аз искам да стане така "снимка1", "снимка2" Как може да стане?
 
ОМГ ?! Сериозно ли ;д Смени си implode-а ;д
Код:
$r = trim('"'.implode('", ', (array) $ar["name"] ),",");
:D :idea: :?:

http://php.net/manual/bg/function.implode.php :idea:
 
Пак не става както искам.
Ето целя код
PHP:
   $ar = array();
     foreach ($this->image["name"] as $file =>$key)  //1
    {
        if(!empty($this->image["name"][$file])) //2
        {
             $ar ["name"] = $this->image["name"][$file];
             $ar ["type"] = $this->image["type"][$file];
           if ($ar["type"]!= 'image/jpeg') {  
      echo  'Попълнете sss2!';
        } else {           
            $sqls  = ("INSERT INTO $tname
		 ($poleta) 
		 VALUES(?,?,?)") ;
	     $stmt = $this->conn->prepare($sqls); 
             $stmt->bind_param("sss", $ar,);

          if ($stmt==true) { 
             $stmt->execute(); 
            print'Back page addnews 5 sec ';
             
          } else { 
            trigger_error('Statement insert failed : ' . $stmt->error, E_USER_ERROR); 
			
 
          } 
        }
Как да вкарам снимките в дб всяка снимка да е в отделна колона?
 
Никои ли не може да помогне? Пробвах вече най- различни начини да запиша снимките в дб, но не се получава както искам. Записва всяка снимка на отделен ред или дава Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables in.
Искам снимките да се записват по следни начин в дб.
колона1 колона2 ...
снимка1 снимка2
 
Защо името на 2 снимка се повтаря 3 пъти?
PHP:
   foreach ($this->image["name"] as $file =>$key)  //1
    {
        
            $t= $this->image["name"][$file];
            echo $this->image["name"][1];

    	
    }
 
Ще ти дам една логическа задачка.

Имаш цикъл(за по-лесно да вземем foreach, както е при теб), който се върти N пъти. В него имаш код, който изпълнява заявка INSERT INTO(който вкарва нов запис(нов ред) в базата данни). Колко пъти ще се изпълни заявката и колко записа съответно ще се направят в базата данни.
 
Ако в цикъла имам две снимки то всяка снимка в дб ще бъде записан на нов ред. Прав ли съм?
 
Именно. За това всяка снимка ти отива на нов ред. Идеята сега е да изведеш заявката извън цикъла, а сглобяването и може отново да стане с implode(). Промени логиката. Там където ти стои заявката просто пълни един масив със снимките, които искаш да качиш и извън цикъла съедини стойностите.
 
Впрочем това

Код:
 foreach ($this->image["name"] as $file =>$key)  //1


Реално погледнато трябва да е така

Код:
 foreach ($this->image["name"] as $key=>$file )  //1
 
Revelation Нещо подобно ли трябва да стане? Или грешно съм разбрал?
PHP:
$ar = array();
     foreach ($this->image["name"] as $file =>$key)  //1
    {
        if(!empty($this->image["name"][$file])) //2
        {
             $ar ["name"] = $this->image["name"][$file];
             $ar ["type"] = $this->image["type"][$file];
           if ($ar["type"]!= 'image/jpeg') {  
      echo  'Попълнете sss2!';
        } else {           
           
$e= array($ar ["name"]);
        }
        }
    }
    //zaqvka 
    $r= implode(',',  $e);
     $sqls =  ("INSERT INTO zaqvka (pic1, pic2) VALUES (?, ?)");
            $stmt = $this->conn->prepare($sqls); 

             $stmt->bind_param("ss", $r);
$stmt->execute();
$stmt->close();
 
Значи, така няма стане, понеже използваш bind_param( предполагам mysqli драйвър ползваш), а той приема поотделно всеки параметър. Имаше вариант да се използва call_user_func_array(), но трябва да се правят разни гимнастики понеже bind_param изисква референтни стойности, които call_user_func_array() не предоставя, ако не се нарпави допълнителна функция.

Също, не това трябваше да се направи.

Ето така се вкарват стойности в масив.
PHP:
$e[] = $ar['name'];

Другия вариант е, ако винаги очакваш да са две снимките, т.е. винаги имаш 2 стойности в масива $e, то най-добре си ги подавай директно на bind_param


PHP:
$stmt->bind_param('ss', $e[0], $e[1]);

Също, предефинирай празен масив преди цикъла(foreach)

PHP:
$e = array();

//... тука foreach

След това е добра практика първо да си проверяваш дали масива все пак имам някакви стойности и чак тогава да изпълняваш заявката, за да няма неочаквани проблеми в бъдеще.

PHP:
if ( sizeof($e) > 0 ) {
        $stmt->bind_param(...);
        $stmt->execute();
}
$stmt->close();

П.П. Махаш implode()
 

Back
Горе