Ir para conteúdo

POWERED BY:

Arquivado

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

li0n.coder

Só consigo enviar uma query para database

Recommended Posts

Estou com um erro que não faço ideia como resolver: Quando eu envio um email para database (MySQL), só consigo enviar outras contas depois de limpar a tabela.

 

Script:

<?php
   class subscribers{
      //outros metodos
      function insert($mail)
        {
            addslashes($mail);
            $sql = "INSERT INTO table1 (name) values('$mail')";
            $conn = new PDO('mysql:host=localhost;dbname=misakicoder', 'root','pass');
            $conn->query($sql);
            unset($conn);
          echo $mail;
        }
   }
   $subscribers = new subscribers;
   $subscribers->insert('keetr@hotmail.com');
?>

database:

CREATE TABLE IF NOT EXISTS `table1` (
  `id` varchar(7) NOT NULL DEFAULT '0',
  `name` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que acontece ao executar o script pela segunda vez? Gera erro? Qual?

 

 

Duas sugestões:

 

1. Já que está usando PDO, considere usar Prepared Statements. Veja este link e este outro

 

2. Prefira usar utf8 em vez de latin1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Habilite todas as exibições de erro, como mostrado neste tópico.

 

Também verifique o retorno do método query(). Será retornado um objeto PDOStatement. Use o método errorInfo(), assim:

 

$stmt = $conn->query($sql);
var_dump( $stmt->errorInfo() );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Refiz o script mas agora estou em outro problema:

<?php
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASSWORD', 'pass');
    define('MYSQL_DB_NAME', 'misakicoder');
   
    ini_set( 'display_errors', true );

    error_reporting( E_ALL );

    try {
        $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
    }

    catch ( PDOException $e ) {
        echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
    }

    $mail = $_POST["mail"];

    if( preg_match ("#^([\w\.-]+)\@([\w\.-]+)+\.([a-z]{2,6})$#",$mail) ) {
        
        $verify_sql = "SELECT * FROM programadores WHERE mail='$mail'";
        
        $stmt2 = $PDO->prepare( $verify_sql );

        $result2 = $stmt2->execute();
        
        if($result2 == true){
            $insert_sql = "INSERT INTO programadores(mail) VALUES(:mail)";

            $stmt = $PDO->prepare( $insert_sql );

            $stmt->bindParam( ':mail', $mail );

            $result = $stmt->execute();

            if ( ! $result ) {
                var_dump( $stmt->errorInfo() );
                exit;
            }

            echo $stmt->rowCount() . "linhas inseridas";
        }
        else {
            echo ("Esse email já foi cadastrado");
        }
     
    } else {
        echo "Não Passou!";
        exit;
    }
?>

Quanto o email já existe no banco de dados ele cria outra conta, mas preciso que ele dê um exit se o email já tiver no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use rowCount para saber quantas linhas retornaram, se retornou 0 é porque o e-mail não está cadastrado ainda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fatal error: Call to a member function rowcount() on a non-object in C:\xampp\htdocs\teste.php on line 29

<?php
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASSWORD', 'pass');
    define('MYSQL_DB_NAME', 'misakicoder');
   
    ini_set( 'display_errors', true );

    error_reporting( E_ALL );

    try {
        $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
    }

    catch ( PDOException $e ) {
        echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
    }

    $mail = $_POST["mail"];

    if( preg_match ("#^([\w\.-]+)\@([\w\.-]+)+\.([a-z]{2,6})$#",$mail) ) {
        
        $verify_sql = "SELECT * FROM programadores WHERE mail='$mail'";
        
        $stmt2 = $PDO->prepare( $verify_sql );

        $result2 = $stmt2->execute();
        
        if($result2->rowCount() == 0){
            $insert_sql = "INSERT INTO programadores(mail) VALUES(:mail)";

            $stmt = $PDO->prepare( $insert_sql );

            $stmt->bindParam( ':mail', $mail );

            $result = $stmt->execute();

            if ( ! $result ) {
                var_dump( $stmt->errorInfo() );
                exit;
            }

            echo $stmt->rowCount() . "linhas inseridas";
        }
        else {
            echo ("Esse email já foi cadastrado");
        }
     
    } else {
        echo "Não Passou!";
        exit;
    }
?>

Poderia me dizer a forma certa de usar o comando ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro apresentado é desta linha:

echo $stmt->rowCount() . "linhas inseridas";

O correto é:

echo $result->rowCount() . "linhas inseridas";

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro ainda persiste, e tenho certeza que está na linha 29:

if($result2->rowCount() == 0){

ou no SQL:

$verify_sql = "SELECT * FROM programadores WHERE mail='$mail'";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então vamos ao debug:

print_r($result2->errorInfo())

Coloque isto após a execução da query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fatal error: Call to a member function errorInfo() on a non-object in [/size]C:\xampp\htdocs\teste.php on line [/size]27

Percebi que ficou uma quebra de linha antes do erro, mas eu já coloquei para mostrar todos os erros. Com e sem debug não apareceu nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

errorInfo é usado no objeto PDOStatement. No seu caso, a variável $stmt

 

Faça assim

 

print_r($stmt->errorInfo());

 

 

O método execute() retorna booleano:

http://php.net/manual/pt_BR/pdostatement.execute.php

 

Por isso esta linha falha:

 

if($result2->rowCount() == 0){

 

tem que usar $stmt, que é a instância de PDOStatement

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido, obrigado Beraldo!

Script para quem quiser:

<?php
    define('MYSQL_HOST', 'localhost');
    define('MYSQL_USER', 'root');
    define('MYSQL_PASSWORD', 'pass');
    define('MYSQL_DB_NAME', 'misakicoder');

    ini_set( 'display_errors', true );
    error_reporting( E_ALL );

    try {
        $PDO = new PDO( 'mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD );
    }

    catch ( PDOException $e ) {
        echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
    }

    $mail = $_POST["mail"];

    if( preg_match ("#^([\w\.-]+)\@([\w\.-]+)+\.([a-z]{2,6})$#",$mail) ) {
        
        $verify_sql = "SELECT * FROM programadores WHERE mail='$mail'";
        
        $stmt2 = $PDO->prepare( $verify_sql );

        $result2 = $stmt2->execute();

        if($stmt2->rowCount() == 0){
            
            $insert_sql = "INSERT INTO programadores(mail) VALUES(:mail)";

            $stmt = $PDO->prepare( $insert_sql );

            $stmt->bindParam( ':mail', $mail );

            $result = $stmt->execute();

            if ( ! $result ) {
                var_dump( $stmt->errorInfo() );
                exit;
            }

            echo $stmt->rowCount() . "cadastrado!";
            
        } else {
            echo ("Esse email já foi cadastrado");
            exit;
        }
        
    } else {
        echo "Este email não é válido!";
        exit;
    }
?>

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.