PHP/Codeigniter ошибку "Array to string conversion"


я Сделал foreach, чтобы добавить значения в insert, но вдруг появилась ошибка Array to string conversion странно, и я понятия не имею, что это.

public function distribuicaoprodutos(){
        $filiais=json_decode($_POST['filiais'],TRUE);
        $dados=json_decode($_POST['dados'],TRUE);
        $insert="INSERT INTO movimentacao (Filial, Quantidade) VALUES ";
        $i=0;
        foreach($filiais as $key => $value)
        {
            $i++;
            if($value!="" && strlen($filiais)>$i) //linha de erro
            {
                $insert.="('".$key."','".$value."'),";  
            }elseif($value!="" && strlen($filiais)==$i){
                $insert.="('".$key."','".$value."')";
            }   
        }


    }
Author: Sergio, 2014-02-18

4 answers

Измерить размер массива, функции, используемой sizeof, а не strlen (измеряет размер строки).

Следует намек на изменение вашего кода:

public function distribuicaoprodutos()
{
    $filiais = json_decode($_POST['filiais'], true);
    $dados   = json_decode($_POST['dados'], true);
    $insert  = "INSERT INTO movimentacao (Filial, Quantidade) VALUES ";
    foreach ($filiais as $key => $value)
    {
        if (!empty($value)) {
            $insert .= "('" . $key . "', '" . $value . "'), ";
        }
    }
    $insert = substr($insert, 0, -2);
}
 3
Author: Rodrigo Rigotti, 2014-02-18 14:55:03

Использовать кол-во() или sizeof() чтобы получить размер массива.
В вашем коде вы можете сделать кэша значение размера массива $филиалов за пределами цикла, чтобы избежать вызова функции count() на каждой итерации.

Тест так:

 $i=0;
 $filiaisTamanho = count($filiais);
 foreach($filiais as $key => $value){
            $i++;
            if($value!="" && $filiaisTamanho>$i) //linha de erro
            {
                $insert.="('".$key."','".$value."'),";  
            }elseif($value!="" && $filiaisTamanho==$i){
                $insert.="('".$key."','".$value."')";
            }   
        }

, Но на самом деле, если это только потому, что ultima запятая, и не имеет больше кода, чем нужно счетчика $i, то можно использовать так:

foreach($filiais as $key => $value){
    if ($value != "") $insert.= "('".$key."','".$value."'),";
}
$insert= rtrim($insert, ',');
 2
Author: Sergio, 2014-02-18 15:08:19

Он говорит, что вы пытаетесь использовать массив как string Данные, которые идут через POST в формате json, до тех пор, ок, но какова структура этого JSON ? Это имеет первостепенное значение для лечения этой проблемы.

В Этом случае, я рекомендую дать print_r() или var_dump() на $_POST['филиалы'] и $_POST['данные'] и проверьте, в каком формате находится этот json, чтобы можно было обработать соответствующим образом.

Другая вещь, которую я советую использовать Active Record в CodeIgniter ( Здесь ), чтобы сделать эту insert, и проводить лечение insert ПЕРЕД, а не во время выполнения его.

Я Говорю это потому, что предпочтительнее лечить до или собрать структуру, которая будет установлена перед, во время процесса установки.

Если вы разместите этот json или более или менее структура его, может быть, мне удастся быть более точным, в моей помощи

Я Надеюсь, что помог

 1
Author: Leandro Cissoto, 2014-02-18 14:56:57

Версия вашего кода, снижается.

public function distribuicaoprodutos(){
        $filiais=json_decode($_POST['filiais'],TRUE);
        $dados=json_decode($_POST['dados'],TRUE);
        $insert="INSERT INTO movimentacao (Filial, Quantidade) VALUES  ";
        foreach($filiais as $key => $value)        
            $insert.="('".$key."','".$value."'),";                     
        $insert = substr($insert,0,strlen($insert)-1); // retirar a ultima virgula;         
}
 1
Author: Tuyoshi Vinicius, 2014-02-18 16:22:43