Skip to content
Advertisement

Insert Excel datas on mysql with php

I’m trying to insert excel datas in mysql with php, I have a code but it’s inserting only the first line off the archive and my archive has 3 lines.

Someone knows how to help me?

 public function incluirLote()
{

    if (!empty($_FILES['arquivo']['tmp_name'])) {
        $arquivo = new DOMDocument;
        $arquivo->load($_FILES['arquivo']['tmp_name']);
         $linhas = $arquivo->getElementsByTagName("Row");
          $countlinha = 1;

        foreach ($linhas as $linha) {
            if ($countlinha > 1) {
                $nome = $linha->getElementsByTagName("Data")->item(0)->nodeValue;
                echo "Nome: $nome <br>";

                $email = $linha->getElementsByTagName("Data")->item(1)->nodeValue;
                echo "E-mail: $email <br>";

                $niveis_acesso_id = $linha->getElementsByTagName("Data")->item(2)->nodeValue;
                echo "Nivel de Acesso: $niveis_acesso_id <br>";

                echo "<hr>";


                $conn = $this->connect();
                $sql = "insert into usu (nome, email, niveis_acesso_id)  VALUES (:nome, :email, :niveis_acesso_id) ";

                $stmt = $conn->prepare($sql);
                $stmt->bindParam(':nome', $nome);
                $stmt->bindParam(':email', $email);
                $stmt->bindParam(':niveis_acesso_id', $niveis_acesso_id);
                $stmt->execute();

                return $stmt;
            }
            $countlinha++;
        }
    }
}

Advertisement

Answer

Your script has the following happening:

You set $countlinha = 1;

Which means the condition if ($countlinha > 1) is false on first iteration of foreach($linhas as $linha). I.e. the first ‘record’ inside $linhas is not processed.

Then you increment $countlinha++; it becomes 2

So on second iteration of foreach($linhas as $linha) the code inside the if ($countlinha > 1) is executed.

The second ‘record’ inside $linhas is echoed and written to database.

However, return $stmt; now terminates your script.

So all in all you only got one ‘record’ processed.

TLDR

If you want to get all ‘records’ inside $linhas processed, you should drop the if ($countlinha > 1) condition, and do NOT return inside the loop as it will terminate your script prematurely.

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement