Ir para conteúdo

Arquivado

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

Chris Martin

script em php com PDO não executa

Recommended Posts

depois de pegar os valores via post, fiz uma verificação, mas o código não é executado, portanto não verifica os dados, e também não insere no mysql

if(empty($nome)){
	echo "<script>alert('O nome não pode ficar vazio'); history.back();</script>";
}elseif(empty($usuario)){
	echo "<script>alert('O usuário não pode vicar vazio'); history.back();</script>";
}elseif (empty($senha)) {
	echo "<script>alert('Por favor coloque uma senha'); history.back();</script>";
}elseif(empty($pass)){
	echo "<script>alert('Por favor repita a sua senha'); history.back();</script>";
}elseif ($senha <> $pass) {
	echo "<script>alert('As senhas estão diferentes'); history.back();</script>";
}elseif($usr->rowCount() == 1){
	echo "<script>alert('O usuário:."$usuario ". já existe, tente outro usuário'); history.back();</script>";
}elseif($eml->rowCount == 1){
	echo "<script>alert('O email: ."$email ". já está cadastrado, por favor tente outro'); history.back();</script>";

}elseif ($image->check($_POST['captcha_code']) == false) {
      echo "<script>alert('Desculpe, você errou o captcha. Tente novamente'); history.back();</script>";
    } else {
 				$inserir=$pdo->prepare("INSERT INTO users (nome, email, usuario, senha) VALUES (':valuea', ':valueb', ':valuec', ':valued')");
 		$inserir->bindValue(":valuea", $nome);
 		$inserir->bindValue(":valueb", $email);
 		$inserir->bindValue(":valuec", $usuario);
 		$inserir->bindValue(":valued", $senha);
 		$inserir->execute();
}

e o PDO não retorna erro

o que está errado aqui?

Compartilhar este post


Link para o post
Compartilhar em outros sites

- Begin Transaction: comando para indicar onde uma transação será iniciada. A partir desse comando, todas as querys surtirão efeitos permanentes no banco de dados somente quando for executado o commit;

- Commit: comando para confirmar a execução de todas as querys executadas na transação. Após o commit não poderá ser desfeito as manipulações ocorridas. Ocommit deve ser executado depois de todas as verificações de erros.

Fonte: http://www.rafaelwendel.com/2011/12/controle-de-transacoes-no-pdo/

 

Utilize o TRY/CATCH para tratar os erros da transação.

try{
$pdo->beginTransaction();

$inserir=$pdo->prepare("INSERT INTO users (nome, email, usuario, senha) VALUES (':valuea', ':valueb', ':valuec', ':valued')");
$inserir->bindValue(":valuea", $nome);
$inserir->bindValue(":valueb", $email);
$inserir->bindValue(":valuec", $usuario);
$inserir->bindValue(":valued", $senha);
$inserir->execute();

$pdo->commit()
}catch (PDOException $e){
    echo $e->getMessage();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu já tenho o try e catch na hora de conectar no data base, não tem problema?

e assim, nada do código está sendo executado, nadinha mesmo é como se o arquivo php que trata as string estivesse vazio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ative a exibição de erros e execute novamente:

ini_set('error_reporting', E_ALL);
ini_set('log_errors' , TRUE);
ini_set('html_errors' , TRUE);
ini_set('display_errors' , TRUE);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu coloquei o código acima no meu arquivo mas nada acontece

<?php

ini_set('error_reporting', E_ALL);
ini_set('log_errors' , TRUE);
ini_set('html_errors' , TRUE);
ini_set('display_errors' , TRUE);

$usr = $pdo->query("SELECT * FROM users WHERE usuario='$usuario'");
$eml = $pdo->query("SELECT * FROM users WHERE email='$email'");

if(empty($nome)){
	echo "<script>alert('O nome não pode ficar vazio'); history.back();</script>";
}elseif(empty($usuario)){
	echo "<script>alert('O usuário não pode vicar vazio'); history.back();</script>";
}elseif (empty($senha)) {
	echo "<script>alert('Por favor coloque uma senha'); history.back();</script>";
}elseif(empty($pass)){
	echo "<script>alert('Por favor repita a sua senha'); history.back();</script>";
}elseif ($senha <> $pass) {
	echo "<script>alert('As senhas estão diferentes'); history.back();</script>";
}elseif($usr->rowCount() == 1){
	echo "<script>alert('O usuário:."$usuario ". já existe, tente outro usuário'); history.back();</script>";
}elseif($eml->rowCount == 1){
	echo "<script>alert('O email: ."$email ". já está cadastrado, por favor tente outro'); history.back();</script>";

}elseif ($image->check($_POST['captcha_code']) == false) {
      echo "<script>alert('Desculpe, você errou o captcha. Tente novamente'); history.back();</script>";
    } else {
    	try{
    		$pdo->beginTransaction();

 				$inserir=$pdo->prepare("INSERT INTO users (nome, email, usuario, senha) VALUES (':nome', ':email', ':user', ':senha')");
 		$inserir->bindValue(":nome", $nome);
 		$inserir->bindValue(":email", $email);
 		$inserir->bindValue(":user", $usuario);
 		$inserir->bindValue(":senha", $senha);
 		$inserir->execute();

 		$pdo->commit();
 	}catch (PDOException $e){
 		echo ."ERRO:".$e->getMessage();
 	}
}
?>

Olha como ficou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há um erro na linha 23. rowCount é uma função, faltam os parênteses:

} elseif($eml->rowCount == 1){

Outro detalhe é sobre as duas queries acima (linhas 8 e 9). Ocorre um problema ao retornar dados em uma consulta e, em outra consulta, retornar os dados sem fechar o cursor da primeira consulta.

 

Entretanto, isso acontece quando se utiliza o método fetch(), o que não parece ser o seu caso. Mas não custa tentar. Como pode ver no seguinte exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
echo ."NOME: ".$nome."USUARIO: ".$usuario;//Linha para testes

$usr = $pdo->query("SELECT * FROM users WHERE usuario='$usuario'");
$usr->execute();
$usr->fetch();
$usr->closeCursor();
$eml = $pdo->query("SELECT * FROM users WHERE email='$email'");
$eml->execute();

if(empty($nome)){
	echo "<script>alert('O nome não pode ficar vazio'); history.back();</script>";
}elseif(empty($usuario)){
	echo "<script>alert('O usuário não pode vicar vazio'); history.back();</script>";
}elseif (empty($senha)) {
	echo "<script>alert('Por favor coloque uma senha'); history.back();</script>";
}elseif(empty($pass)){
	echo "<script>alert('Por favor repita a sua senha'); history.back();</script>";
}elseif ($senha <> $pass) {
	echo "<script>alert('As senhas estão diferentes'); history.back();</script>";
}elseif($usr->rowCount() == 1){
	echo "<script>alert('O usuário:."$usuario ". já existe, tente outro usuário'); history.back();</script>";
}elseif($eml->rowCount() == 1){
	echo "<script>alert('O email: ."$email ". já está cadastrado, por favor tente outro'); history.back();</script>";

}elseif ($image->check($_POST['captcha_code']) == false) {
      echo "<script>alert('Desculpe, você errou o captcha. Tente novamente'); history.back();</script>";
    } else {
    	try{
    		$pdo->beginTransaction();

 				$inserir=$pdo->prepare("INSERT INTO users (nome, email, usuario, senha) VALUES (':nome', ':email', ':user', ':senha')");
 		$inserir->bindValue(":nome", $nome);
 		$inserir->bindValue(":email", $email);
 		$inserir->bindValue(":user", $usuario);
 		$inserir->bindValue(":senha", $senha);
 		$inserir->execute();

 		$pdo->commit();
 	}catch (PDOException $e){
 		echo ."ERRO:".$e->getMessage();
 	}
}

?>

olha na linha para testes geralmente aparecia o nome e o usuário, eu já executei o código como Você disse, mas da mesma forma que eu disse parece que o código não executa porque no echo não aparece nada, deveria ao menos aparecer NOME: e USUARIO: e nem isso aparece eu estava chamando uns arquivos por require, pensei que fosse isso ai troquei para include e não mudou nada. Mudei até as pseudo tags ali na hora de passar os valores

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se nem a primeira linha que possui o echo não aparece, o seu problema não é nesse script, é no que está incluindo esse script.


Ou é um problema no PHP em geral, que não deve estar executando direito. Coloque o código, de exibição de erros, que eu te passei no script que inclui essa página.

Compartilhar este post


Link para o post
Compartilhar em outros sites

em um script eu tenho a conexão em PDO:

<?php
//define os valores das variáveis aqui 
try{
$pdo = new PDO('mysql:host='.$host.';dbname='.$db.'', $user, $pass);
}catch(PDOException $e){
	echo $e->getMessage();
}
?>

e o outro arquivo eu tenho uma lib de uma api de um captcha para fazer a verificação, coloquei o código:

ini_set('error_reporting', E_ALL);
ini_set('log_errors' , TRUE);
ini_set('html_errors' , TRUE);
ini_set('display_errors' , TRUE);

mas novamente eu não consegui executar o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De duas uma, ou você tem um parser error ou seus arquivos não estão sendo executados.

 

Alterações de configurações em tempo de execução (ini_set) não são realizadas quando há parse erros, o que é um indício de não exibir nada de erro na sua tela. Verifique os logs do apache.

 

E por último, seu script pode não estar sendo executados, o que também resultaria em nenhuma alteração com os códigos adicionado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

só por via das duvidas, já verificou se as extensões ao Mysql e PDO estão realmente ativadas (habilitadas)?

outra possibilidade: se é um site hospedado, de uma checada com a hospedagem..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou em localhost, é só para fins didáticos portanto não tenho interesse em hospedar, os módulos do PDO estão ativos, eu uso Ubuntu e lembro de instalar algo como php5-pdo, e o PDO Funcionou, porque eu rodei a conexão sem os dados ai mostrou erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não li tudo, mas que eu saiba o próprio pdo tratará de escapar os seus dados, então não tem necessidade de usar os nomes dos parâmetros como string:

 

 

VALUES (':nome', ':email', ':user', ':senha')

 

Vira

 

 

VALUES (:nome, :email, :user, :senha)

 

Mas pode ser outra coisa também...

Compartilhar este post


Link para o post
Compartilhar em outros sites

troquei da forma que você mandou, só que não deu certo o problema é quando coloco a verificação eu estava usando $variavel->rowcount(); não executava parava antes mesmo de chegar nessa parte ai eu coloquei isso:

<?php
$eml = $pdo->prepare('SELECT COUNT (*) usuario WHERE email=:email');
	$eml->bindValue(":email",$email);
	$eml->execute();
	$lem = $eml->fetchColumn();
if($lem == 0){
	$usr = $pdo->prepare('SELECT COUNT (*) usuario WHERE email=:usuario');
	$usr->bindValue(":usuario",$usuario);
	$usr->execute();
	$lsr = $usr->fetchColumn();
	if($lsr == 0){
		$inserir->execute();
		echo '<script>alert("Você foi cadastrado com sucesso");</script> <meta http-equiv="refresh" content="1;url=../dash/index.php">';
	}else{
		echo "<script>alert('O usuário: ."$usuario". Já está cadastrado!'); history.back();</script>";
	}
}else{
	echo "<script>alert('O email: ."$email". Já está cadastrado!'); history.back();</script>";
}
?>

mas da mesma forma não adiantou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
print_r($pdo->errorInfo());

depois de incluir todos os arquivos eu coloquei essa linha, mas ai dessa vez a página fica carregando eternamente não mostra nada nenhum echo nenhum print_r nada não executa código algum, eu fiz um arquivo que incluo nas páginas para criar um arquivo de log de erros, mas sempre o arquivo está vazio

quando esse bloco de códigos estão comentados ou ausentes o código roda normalmente

$eml = $pdo->prepare('SELECT COUNT (*) usuario WHERE email=:email');
	$eml->bindValue(":email",$email);
	$eml->execute();
	$lem = $eml->fetchColumn();
if($lem == 0){
	$usr = $pdo->prepare('SELECT COUNT (*) usuario WHERE email=:usuario');
	$usr->bindValue(":usuario",$usuario);
	$usr->execute();
	$lsr = $usr->fetchColumn();
	if($lsr == 0){
		$inserir->execute();
		echo '<script>alert("Você foi cadastrado com sucesso");</script> <meta http-equiv="refresh" content="1;url=../dash/index.php">';
	}else{
		echo "<script>alert('O usuário: ."$usuario". Já está cadastrado!'); history.back();</script>";
	}
}else{
	echo "<script>alert('O email: ."$email". Já está cadastrado!'); history.back();</script>";
} 

depois que adiciona não executa nada, tem outras forma alternativas de eu verificar no mysql se já existe um determinado valor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chris, da uma olhada nas suas duas querys, posso estar enganado mas voce nao esta setando a tabela a qual qer fazer a contagem:

SELECT COUNT (*) usuario WHERE email=:email
SELECT COUNT (*) usuario WHERE email=:usuario

Tente indique a tabela usando o FROM

SELECT COUNT (*) FROM usuario WHERE email=:email

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.