Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
Era isso mesmo Anderson, ué, mas estranho, sou obrigado ou remover um parametro do array ou usar ele mesmo sem eu precisar!?
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.
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.