Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá amigos,
n estou conseguindo retorna o lastInsertId no PDO.. ele sempre retorna 0 e o insert é feito com sucesso na base
$gravar = array(
'status_id' => 1, //$ses[''],
'categoria_id' => $ses['categoria_id'],
'cliente_id' => $_SESSION['cliente_id']['id'],
'pergunta' => $ses['pergunta']
);
echo "<pre>";
var_dump($gravar);
$db->gravar("perguntas",$gravar);
echo $db->pdo()->lastInsertId();public function gravar($tabela,$dados,$tipo = null) {
$keys = array();
$values = array();
foreach($dados as $key => $val) {
$keys[] = ':'.$key;
$values[] = $key;
}
$valuesSet = implode(", ",$values);
$valuesArray = implode(", ",$keys);
$finalQuery = "(".$valuesSet.") VALUES (".$valuesArray.")";
$tab = "INSERT INTO ".$tabela." ";
$bancoG = $this->pdo()->prepare($tab.$finalQuery);
return $bancoG->execute($dados);
}teste assim, insira o registro e na mesma função e chame lastInsertId. isso acontece em qual banco?
já tentei da no mesmo
Vou te dar um exemplo de como eu utilizo na minha classe de manipulação de dados do banco:
$sql = sprintf( "INSERT INTO %s ( %s ) VALUES( %s )", $table, $collums, $tokens );
$this->pdo->prepare( $sql )->execute( $data );
return $this->pdo->lastInsertId();
Vê se você consegue arrumar ou apenas usar como base na sua função.
vai ver a conexão não esta ativa quando vc lastInsertId(), tente assim:
qual banco vc esta usando?
public function gravar($tabela,$dados,$tipo = null) {
$keys = array();
$values = array();
foreach($dados as $key => $val) {
$keys[] = ':'.$key;
$values[] = $key;
}
$valuesSet = implode(", ",$values);
$valuesArray = implode(", ",$keys);
$finalQuery = "(".$valuesSet.") VALUES (".$valuesArray.")";
$tab = "INSERT INTO ".$tabela." ";
$bancoG = $this->pdo()->prepare($tab.$finalQuery);
$result = $bancoG->execute($dados);
echo 'ultimo id: '. $this->pdo->lastInsertId();
return $result;
}já tentei da forma acima... retona 0 da mesma forma e ele faz o insert, estou usando o banco mysql
vc ja tentou usar o last_insert_id do mysql?
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
mas vai me dar a mesma fidelidade do lastInsertId, o ruim q vou ter q passar outra consulta
so isso aqui ja funciona, desde q tenha sido executado um insert
SELECT LAST_INSERT_ID();
vou tentar testar novamente sua classe.
testei aqui novamente sua classe com os ajuste para funcionar....
removi os () de pdo, pq acho q ele não é um metodo e sim uma propriedade...
$bancoG = $this->pdo()->prepare($tab.$finalQuery);
$db->gravar("perguntas",$gravar);
echo $db->pdo()->lastInsertId();removi os () de pdo, pq acho q ele não é um metodo e sim uma propriedade...
Justamente o que eu ia comentar. No post #7 você, Jordan, disse ter "tentado da forma acima".
Mas o post #6 não considerava esse par de parênteses que distingue uma propriedade de um método.
Poste a declaração ("corpo") do método pdo(), se é que ele é um método mesmo pois, caso você esteja de alguma forma perdendo o vínculo entre a PDO e a PDOStatement, criado por PDOStatement::execute(), realmente não vai funcionar.
eu uso () pq uso assim
public function pdo() {
try {
return $pdo = new PDO("mysql:host=localhost;dbname=mydb","root","");
} catch (PDOException $e) {
echo $e->getMessage();
}
}iiiii ja era cara.... td vez vc ta criando uma conexão nova, pra pegar o ultimo id vc tem q estar na mesma conexão.
lemrabdmo q consigo tudo insert, pdate, delete só quando uso o lastInsertId mesmo ele fazendo o insert ele sempre retorna o 0
outra forma é vc criar uma propridade, q tenha o objeto PDO, e no tal metodo pdo verifica se ela é vazia/invalida(cria um PDO) se não retorna a conexão existente.
Justamente por isso que pedi para que você postasse a declaração do método pdo().
Primeiro, entenda o porquê não funciona.
Tudo aquilo feito antes de executar uma ação é feito no objeto PDO e quase tudo aquilo que é feito depois da ação ter sido executada, no objeto PDOStatement.
Quase porque ao meu ver o método PDO::lastInsertId() não deveria pertencer à PDO e sim à PDOStatementpois ele retorna uma informação após a ação e não antes dela.
Enfim...
Cada novo objeto instanciado possui um identificador interno único, identificador este obtenível (tremendo chute gramatical esse :P) pela função spl_object_hash().
Como toda vez que você invoca o método pdo() você cria um novo objeto (crédito extra: experimenta usar spl_object_hash() logo após a instância) o vínculo criado entre a PDOStatement com a PDO por intermédio de PDOStatement:execute() não chega a ser desfeito pois pdo() retorna a nova instância, mas se torna inacessível pois agora refere-se à outro objeto.
Para solucionar esse problema:
Feito isso, no método pdo() você verifica o valor dessa propriedade. Se for uma instância de PDO, você retorna a propriedade. Se não for você invoca o método de conexão novamente e só então retorna a propriedade.
Dessa forma, a propriedade SEMPRE terá um objeto PDO e, contanto que sua aplicação respeite o fluxo vertical e crescente de uma Requisição, você não terá mais esse problema.
Se vier a ter, um Singleton Registry resolve, apesar de mal visto por alguns programadores.
>
Se vier a ter, um Singleton Registry resolve, apesar de mal visto por alguns programadores.
flame começando em .... 3....2...
eu fui direto no mysql admin e rodei essa consulta
SELECT LAST_INSERT_ID( )
FROM perguntas
ele retornou uns 30 registros tudo com 0
/applications/core/interface/imageproxy/imageproxy.php?img=http://bolao.es/tela.png&key=677aaa77298168bb3505050e9b50a4571b1b3adb7fcdbb79fa63fd9c0f000767" alt="tela.png" />
>
eu fui direto no mysql admin e rodei essa consulta
SELECT LAST_INSERT_ID( )
FROM perguntas
ele retornou uns 30 registros tudo com 0
/applications/core/interface/imageproxy/imageproxy.php?img=http://bolao.es/tela.png&key=677aaa77298168bb3505050e9b50a4571b1b3adb7fcdbb79fa63fd9c0f000767" alt="tela.png" />
pq n teve nenhum inser nessa sessão/conexão, roda um insert antes rsrs
vou rodar... minha estrutura ta assim
CREATE TABLE IF NOT EXISTS `perguntas` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status_id` int(11) DEFAULT NULL,
`categoria_id` int(11) DEFAULT NULL,
`cliente_id` int(11) DEFAULT NULL,
`pergunta` text,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=43 ;postei minha cass de insert no pastbin http://pastebin.com/xWe3i3Rh
leia com calma o post #16 la tem a ideia da solução.
Muito obrigado, eu resolvi... Obrigado pela paciencia... era o sono ontem que não me deixou ver de forma clara....
Ja tentou chamar ela ligada direto a variavel de coneção com a pdo, ex.
class Crud{
...
//Ultimo id cadastrado