Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Amigos,
Alguém pode me ajudar como resolver esse problema?
Estou fazendo da seguinte forma:
if(mysqli_affected_rows() >= 0) {
$idInserido = mysqli_insert_id();
... ... ...
}
AttOi @Matheus Tavares
Sim eu verifiquei. Vou te passar o trecho do script pra você entender melhor o que eu estou fazendo, talvez fique mais claro pra você me ajudar.
Dessa forma que eu fiz, como devo chamar o link de conexão?
function consulta($sql) {
$conexao = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (mysqli_connect_errno()) trigger_error(mysqli_connect_error());
$consulta = $conexao->query($sql) or die("<strong>ERRO</strong><br><br>SQL:<br><b>".$sql."</b><br><br>Error:<br><b>".mysqli_error($conexao)."</b>");
return $consulta;
}
$sqlInsert = "INSERT INTO teste (nome, email) VALUE ('Adriano', 'xxx@gmail.com')";
$insert = consulta($sqlInsert);
if(mysqli_affected_rows() >= 0) {
$ultimoId = mysqli_insert_id();
.... .... ....
}
Tenho uma outra function que é assim:
function mnr($sql) {
return mysqli_num_rows($sql);
}
eu poderia fazer dessa forma?
$ultimoId = mnr($insert) + 1;
Mas é meio gambiarra não é?
Se puder me ajudar te agradeço muito. Estou tendo esse problema pois alteramos a versão do PHP então muita coisa já está pronta, achei que substituindo apenas mysql_affected_rows por mysqli_affected_rows iria funcionar.
O mesmo se aplica para o mysql_insert_idO ideal era usar classes (orientação à objetos), mas não vou complicar pra você:
conexao.php
<?php
$conexao = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ( mysqli_connect_errno() )
trigger_error( mysqli_connect_error() );
function consulta( $sql ) use ( $conexao ) {
return $conexao->query( $sql )
or die("<strong>ERRO</strong><br><br>SQL:<br><b>".$sql."</b><br><br>Error:<br><b>".mysqli_error($conexao)."</b>");
}
//dessa forma $conexao fica em um contexto global (fora da função)
Inclua o arquivo acima em todas as páginas que interagirem com o banco.
Agora você pode chamar $conexao onde quiser:
<?php
//após ter incluido o arquivo conexao.php:
if ( mysqli_affected_rows( $conexao ) >= 0 ) {
Opa! Me dei conta de que cometi um deslize no meu post anterior.
A sintaxe do 'use' em function é válida somente para Closures/funções anônimas, que não é o nosso caso.
Em outras palavras, isso aqui não funciona:
function consulta( $sql ) use ( $conexao ) {
Você tem duas opções:
**1 - Usar consulta como uma função anônima, da seguinte forma:**
$consulta = function ( $sql ) use ( $conexao ) {
//implementação da função normalmente aqui...
};
para usar:
$consulta( 'SEU SELECT VEM AQUI' );
// Sim, a única diferença no uso é o $ antes da função
2 - Ou passar sua conexão como parâmetro da função consulta:
function consulta( $conexao, $sql ) {
//implementação...
}
consulta( $conexao, 'SQL AQUI' );
Escolha o modo que preferir e adapte ao seu código...@Matheus Tavares
Não deu muito certo não.
Fiz da seguinte forma:
$conexao = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (mysqli_connect_errno()) trigger_error(mysqli_connect_error());
$consulta = function ( $sql ) use ( $conexao ) {
return $conexao->query($sql) or die("<strong>ERRO</strong><br><br>SQL:<br><b>".$sql."</b><br><br>Error:<br><b>".mysqli_error($conexao)."</b>");
};
Até ai não deu erro, porém eu tenho isso aqui:
function mnr($sql) {
return mysqli_num_rows($sql);
}
function mfo($sql) {
return mysqli_fetch_object($sql);
}
Foi quando começou a dar erro. Estou fazendo a parte da conexão errada?
Agradeço sua atenção
AbsEntão, meu amigo:
1 - Lembre-se de que como você preferiu usar a função consulta em forma de variável, você precisa dar um nome que dificulte a sobrescrita nessa variável. Em outras palavras, se você definiu "$consulta = function..." você tem que cuidar para que no meio desse processo você não faça algo como:
$consulta = 'SELECT * FROM tabela'; //sobrescreveu a função...
Por isso o ideal seria usar o nome da função com algo como $consultarBanco ou $fn_consulta. Talvez seja esse o problema.
2 - Você disse apenas que começou a dar erro, mas não temos como adivinhar o que pode ser... verifique o que eu disse acima e caso o erro persista, cole ele aqui.
**EDIT:** outra coisa, sem relação com o problema... esses nomes de funções estão horríveis, meu caro. Imagine alguém abrir um código cheio de mnr(), mfo()... Use nomes que expressam seus respectivos propósitos.
getQtdRegistros, getLinhaDaConsulta, por exemplo.@Matheus Tavares
Consegui resolver, veja se está de acordo:
$conexao = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (mysqli_connect_errno()) trigger_error(mysqli_connect_error());
function consulta($conexao, $sql) {
$consulta = $conexao->query($sql) or die("<strong>ERRO</strong><br><br>SQL:<br><b>".$sql."</b><br><br>Error:<br><b>".mysqli_error($conexao)."</b>");
return $consulta;
}
$sqlInsert = consulta($conexao, "INSERT INTO cliente (codigo) VALUES ('".rand(1,100)."')");
if($conexao->affected_rows >= 0) {
echo $conexao->insert_id;
} else {
echo mysql_error();
}
Sobre sua observação dos nomes das funções, farei como sugeriu... obrigado pela sugestão, realmente fica melhor.Perfeito... você trocou o estilo procedural por orientado à objetos.
Foi algo que eu não havia percebido também.
Legal que tenha resolvido!
@Adriano Barbosa, você chegou a visitar o manual? http://php.net/manual/pt_BR/mysqli.affected-rows.php
Você precisa informar o link de conexão ao banco como parâmetro na função affected_rows.