Empty function return

2

Could anyone tell me why my insert2 function is returning null after insertion? it should be returning the string with the success message.

<?php
require_once 'conexao.php';
$con = new Conexao();

function insert($dados, $tabela, $campo_unico) : string{

    global $con;

    //Verifica se tem algum campo que tenha que ser único no BD
    if(is_null($campo_unico)) { 
        insert2($dados, $tabela);
    }else{ //Caso tenha verifica se já existe algum registro
        $sql = "SELECT * FROM ".$tabela." WHERE ".$campo_unico."=:".$campo_unico;
        $select = $con->conectar()->prepare($sql);

        if(is_numeric($dados[$campo_unico])){
            $select->bindValue(":".$campo_unico, $dados[$campo_unico], PDO::PARAM_INT);
        }else {
             $select->bindValue(":".$campo_unico, $dados[$campo_unico], PDO::PARAM_STR);
        }
        $select->execute();

        if( ($select->rowCount()) > 0) {
            return "O ".$campo_unico." informado já existe em nossos registros";
        }else {
            insert2($dados, $tabela);
        }

    }

}

function insert2($dados, $tabela) : string{
        global $con;

        $i = 0;
        $sql = "INSERT INTO " . $tabela . " (";
        foreach ($dados as $key => $valor) {
             if ($i == count($dados)-1) {
                $sql .= " ".$key." ";
            } else {
                $sql .= " ".$key.", ";
            }
            $i++;
        }
        $sql .= ")";
        $sql .= " values (";

        $i = 0;
        foreach ($dados as $key => $valor) {
             if ($i == count($dados)-1) {
                $sql .= " :".$key." ";
            } else {
                $sql .= " :".$key.", ";
            }
            $i++;
        }
        $sql .= ")";

        $insert = $con->conectar()->prepare($sql);
        foreach ($dados as $key => $valor) {
            if (is_numeric($valor)) {
                $insert->bindValue(":$key", $valor, PDO::PARAM_INT);
            } else {
                $insert->bindValue(":$key", $valor, PDO::PARAM_STR);
            }
        }
        if ($insert->execute()) {
            return "Registro inserido com sucesso";
        } else {
            return $insert->errorInfo();
        }
}

The error you are giving is this:

  

Fatal error: Uncaught TypeError: Return value of insert () must be string type, none returned in ...: 34

Which is precisely because the function return is being null Stack trace:

    
asked by anonymous 14.09.2017 / 19:11

2 answers

2

In typed languages it is very common to specify the return type of a method and it must obey this specification otherwise the compiler issues an error. In PHP7 it works the same way or almost.

Notice that in insert() there is only one return, there should be at least two. I left only the skeleton of the function to highlight the problem.

function insert($dados, $tabela, $campo_unico) : string{ //obriga a função retorna o tipo
    global $con;
    if(is_null($campo_unico)) {

    }else{ //Caso tenha verifica se já existe algum registro
        if(is_numeric($dados[$campo_unico])){

        }else {

        }
        $select->execute();

        if( ($select->rowCount()) > 0) {
            return "O ".$campo_unico." informado já existe em nossos registros";
        }else {
            insert2($dados, $tabela);
        }

    }
   //caso o código chegue aqui não existe nenhum return para satisfazer a assinatura do método.
}

When calling insert() on failure errorInfo(); returns an array or you will need a treatment to convert it to a string, it is not enough just to give return insert2($dados, $tabela); this also violates the signature.

insert2() suffers from the same problem see:

function insert2($dados, $tabela) : string{
 //código....

    if ($insert->execute()) {
        return "Registro inserido com sucesso";
    } else {
        return $insert->errorInfo(); //retorna um array o que quebra a assinatura
    }
 }

To resolve the first step is to return the expected type, do not return errorInfo() but a

return implode(' - ', $insert->errorInfo());

Related:

PHP 7 has argument and return typing, but is optional. Is this good or bad?

Return typing in PHP 7. What are the advantages?

    
14.09.2017 / 19:28
3

If I understand the code , I believe that a return is missing in:

if( ($select->rowCount()) > 0) {
    return "O ".$campo_unico." informado já existe em nossos registros";
}else {
    insert2($dados, $tabela);
}

Should be:

if( ($select->rowCount()) > 0) {
    return "O ".$campo_unico." informado já existe em nossos registros";
}else {
    return insert2($dados, $tabela); //Faltava o return
}
    
14.09.2017 / 19:30