Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

junior.vieira

Erro ao inserir com PDO

Recommended Posts

Usando Silex e PDO, via post "aceito" o seguinte formato:

{
	"softwares": [{
		"server": "srvteste13",
		"binary": "phantomjs",
		"software": "phantomjs",
		"daemon": "phantomjs.d",
		"path": "/usr/bin",
		"version": "1.0"
	}, {
		"server": "srvteste13",
		"binary": "teste2",
		"software": "teste2",
		"daemon": "teste2.d",
		"path": "/var/www/teste2",
		"version": "2.0"
	}, {
		"server": "srvteste13",
		"binary": "php",
		"software": "php",
		"daemon": "php.d",
		"path": "/usr/bin",
		"version": "5.6"
	}, {
		"server": "srvteste13",
		"binary": "HTTP",
		"software": "APACHE HTTP",
		"daemon": "HTTP.d",
		"path": "/usr/bin/apache2",
		"version": "2.0"
	}, {
		"server": "srvteste13",
		"binary": "phantomjs",
		"software": "phantomjs",
		"daemon": "phantomjs.d",
		"path": "/bin",
		"version": "2.38"
	}, {
		"server": "srvteste13",
		"binary": "DANIEL",
		"software": "DANIEL",
		"daemon": "DANIEL",
		"path": "DANIEL",
		"version": "DANIEL"
	}]
}

No bd, há uma relação entre tabela por isso o insert com select, segue:

$app->post('/softwares', function(Request $request) use ($app, $dbh) {
    $data = json_decode($request->getContent(), true);
   
    if(isset($data['softwares'])){

$sth = $dbh->prepare("INSERT INTO softwares(HARDWARE_ID, PUBLISHER, NAME, VERSION, FOLDER, COMMENTS, FILENAME, FILESIZE, SOURCE, GUID, LANGUAGE, INSTALLDATE, BITSWIDTH) SELECT id, NULL, :software, :version, :path, NULL, :binary, NULL, NULL, NULL, NULL, NULL, NULL FROM hardware where hardware.name = :server");

            for($i=0; $i < sizeof($data['softwares']); $i++){
                $sth->execute($data['softwares'][$i]);
                $id = $dbh->lastInsertId();
            }



            // response, 201 created
            $response = new Response('Ok', 201);
            $response->headers->set('Location', "/softwares");
            return $response;

        }else{
                $response = array("status" => 400, "code" => 400, "message" => "invalid json format");
                return new Response(json_encode($response), 400);
        }
});

Se eu der um print_r em $data['softwares'] está assim:

Array
(
    [softwares] => Array
        (
            [0] => Array
                (
                    [server] => srvteste13
                    [binary] => phantomjs
                    [software] => phantomjs
                    [daemon] => phantomjs.d
                    [path] => /usr/bin
                    [version] => 1.0
                )

            [1] => Array
                (
                    [server] => srvteste13
                    [binary] => teste2
                    [software] => teste2
                    [daemon] => teste2.d
                    [path] => /var/www/teste2
                    [version] => 2.0
                )

            [2] => Array
                (
                    [server] => srvteste13
                    [binary] => php
                    [software] => php
                    [daemon] => php.d
                    [path] => /usr/bin
                    [version] => 5.6
                )

            [3] => Array
                (
                    [server] => srvteste13
                    [binary] => HTTP
                    [software] => APACHE HTTP
                    [daemon] => HTTP.d
                    [path] => /usr/bin/apache2
                    [version] => 2.0
                )

            [4] => Array
                (
                    [server] => srvteste13
                    [binary] => phantomjs
                    [software] => phantomjs
                    [daemon] => phantomjs.d
                    [path] => /bin
                    [version] => 2.38
                )

            [5] => Array
                (
                    [server] => srvteste13
                    [binary] => DANIEL
                    [software] => DANIEL
                    [daemon] => DANIEL
                    [path] => DANIEL
                    [version] => DANIEL
                )

        )

)

o erro(warning, não erro, porém não insere) que me retorna é:

Warning</b>: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens.

Retorna 6 linhas com esta mensagem, devido ao loop do indice do array enviado via rest.

Já estou a tempos tentando achar o problema e nada, agradeço aos que puderem me dar uma luz.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Esse erro que está aparecendo "Invalid parameter number: number of bound variables does not match number of tokens" é porque a quantidade de parâmetro passados (tokens) para o execute está diferente da quantidade de parâmetros (tokens) usados no INSERT.


Analisando o código, o INSERT utiliza 5 tokens, enquanto no execute são passados 6 tokens.


Outra coisa que pode ser, mas não tenho certeza, é que os parâmetros (tokens) passados para as funções bindParam/bindValue devem iniciar por ":", assim como é usado na consulta. Nos exemplos da documentação da função execute (Example #2) também é utilizado o ":", então talvez seja obrigatório.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Sim.

Você está dizendo que é para o PDO utilizar um valor X na consulta, mas quando o PDO tenta aplicá-lo, ele não encontra onde deve ser aplicado na consulta pois na verdade ele não existe lá. O recomendável é você passar apenas os valores que são utilizados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.