Ir para conteúdo

Arquivado

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

  • 0
MarceloJesus

Update PHP + MySQL apresentando erros

Pergunta

Editei um CRUD onde as pessoas realizam o cadastro, encaminhando os dados para um DB. Criei o formulário para que eu possa ler as informações. Até aí, sem problemas.

Estou apanhando justamente  na parte onde eu possa realizar as modificações dos dados gravados na DB. Utilizo isto para outras DBs e nunca apresentou erros. Recebo a seguinte mensagem ao tentar fazer o UPDATE:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /home/guard714/public_html/marcelojesus/menu/action_voluntarios.php:83 Stack trace: #0 /home/guard714/public_html/marcelojesus/menu/action_voluntarios.php(83): PDOStatement->execute() #1 {main} thrown in /home/guard714/public_html/marcelojesus/menu/action_voluntarios.php on line 83

 

Abaixo, segue os códigos:

OBS: a linha em vermelho ($retorno = $stm->execute();) é a line 83 informada no erro acima.

 

// Verifica se foi solicitada a edição de dados
        if ($acao == 'editar'):

            $sql = 'UPDATE preferencia SET nome=:nome, belo_horizonte=:belo_horizonte, evangelico=:evangelico , paulo_tarso=:paulo_tarso, abc=:abc, nossa_senhora=:nossa_senhora, alberto_cavalcanti=:alberto_cavalcanti, indisponivel=:indisponivel, motivo=:motivo';

            $sql .= 'WHERE id = :id';

            $stm = $conexao->prepare($sql);
            $stm->bindValue(':id', $id);
            $stm->bindValue(':nome', $nome);
            $stm->bindValue(':belo_horizonte', $belo_horizonte);
            $stm->bindValue(':evangelico', $evangelico);
            $stm->bindValue(':paulo_tarso', $paulo_tarso);
            $stm->bindValue(':abc', $abc);
            $stm->bindValue(':nossa_senhora', $nossa_senhora);
            $stm->bindValue(':alberto_cavalcanti', $alberto_cavalcanti);
            $stm->bindValue(':indisponivel', $indisponivel);
            $stm->bindValue(':motivo', $motivo);
             $retorno = $stm->execute();

 

            if ($retorno):
                echo "<div class='alert alert-success' role='alert'>Registro modificado com sucesso. Aguarde, voce esta sendo redirecionado ...</div> ";
            else:
                echo "<div class='alert alert-danger' role='alert'>Erro ao editar registro!</div> ";
            endif;

            echo "<meta http-equiv=refresh content='3;URL=voluntarios.php'>";
        endif;

 

Lembrando que utilizo isto normalmente e nunca deu erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

10 respostas a esta questão

Recommended Posts

Tenta jogar o bindValue do ID por ultimo (   $sql .= 'WHERE id = :id';  ). Em baixo do  $stm->bindValue(':motivo', $motivo);

 

O erro diz que o parâmetro numérico esta indefinido... talvez seja porque você colocou o ID por ultimo na query, e na hora do bindValue ele coloca por ultimo o ':motivo' . Ai ele entende que este ultimo bindValue deve ser numerico, visto que no banco o ID deve estar como tipo INT.

 

Tenta aí e qualquer coisa da um grito aqui man!

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, Arcanck disse:

 

Tente colocar um espaço antes da cláusula WHERE. Deixando assim:

 


$sql .= ' WHERE id = :id';

 

Tentei fazer conforme sua orientação, porém continuou retornado o mesmo erro. O mais estranho é que eu utilizo isto em outros diretórios utilizando outros bancos de dado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue os códigos:

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Sistema de Cadastro</title>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.min2.css">
    <link rel="stylesheet" type="text/css" href="css/custom.css">
</head>
<body>
    <div class='container box-mensagem-crud'>
        <?php
        require 'conexao.php';

        // Atribui uma conexao PDO
        $conexao = conexao::getInstance();

        // Recebe os dados enviados pela submissao
        $acao  = (isset($_POST['acao'])) ? $_POST['acao'] : '';
        $id    = (isset($_POST['id'])) ? $_POST['id'] : '';
        $nome  = (isset($_POST['nome'])) ? $_POST['nome'] : '';
        $belo_horizonte  = (isset($_POST['belo_horizonte'])) ? $_POST['belo_horizonte'] : '';
        $evangelico  = (isset($_POST['evangelico'])) ? $_POST['evangelico'] : '';
        $paulo_tarso  = (isset($_POST['paulo_tarso'])) ? $_POST['paulo_tarso'] : '';
        $abc  = (isset($_POST['abc'])) ? $_POST['abc'] : '';
        $nossa_senhora  = (isset($_POST['nossa_senhora'])) ? $_POST['nossa_senhora'] : '';
        $alberto_cavalcanti  = (isset($_POST['alberto_cavalcanti'])) ? $_POST['alberto_cavalcanti'] : '';
        $indisponivel  = (isset($_POST['indisponivel'])) ? $_POST['indisponivel'] : '';
        $motivo  = (isset($_POST['motivo'])) ? $_POST['motivo'] : '';

 


        // Verifica se foi solicitada a edição de dados
        if ($acao == 'editar'):

            $sql = ' UPDATE preferencia SET nome=:nome, belo_horizonte=:belo_horizonte, evangelico=:evangelico , paulo_tarso=:paulo_tarso, abc=:abc, nossa_senhora=:nossa_senhora, alberto_cavalcanti=:alberto_cavalcanti, indisponivel=:indisponivel, motivo=:motivo';

            $sql .= ' WHERE id = :id ';

            $stm = $conexao->prepare($sql);
            $stm->bindValue(':id', $id);
            $stm->bindValue(':nome', $nome);
            $stm->bindValue(':belo_horizonte', $belo_horizonte);
            $stm->bindValue(':evangelico', $evangelico);
            $stm->bindValue(':paulo_tarso', $paulo_tarso);
            $stm->bindValue(':abc', $abc);
            $stm->bindValue(':nossa_senhora', $nossa_senhora);
            $stm->bindValue(':alberto_cavalcanti', $alberto_cavalcanti);
            $stm->bindValue(':indisponivel', $indisponivel);
            $stm->bindValue(':motivo', $motivo);
            $retorno = $stm->execute();

 


            if ($retorno):
                echo "<div class='alert alert-success' role='alert'>Registro modificado com sucesso. Aguarde, voce esta sendo redirecionado ...</div> ";
            else:
                echo "<div class='alert alert-danger' role='alert'>Erro ao editar registro!</div> ";
            endif;

            echo "<meta http-equiv=refresh content='3;URL=voluntarios.php'>";
        endif;


        // Verifica se foi solicitada a exclusao dos dados
        if ($acao == 'excluir'):


            // Exclui o registro do banco de dados
            $sql = 'DELETE FROM preferencia WHERE id = :id';
            $stm = $conexao->prepare($sql);
            $stm->bindValue(':id', $id);
            $retorno = $stm->execute();

            if ($retorno):
                echo "<div class='alert alert-success' role='alert'>Registro excluido com sucesso. Aguarde, voce esta sendo redirecionado ...</div> ";
            else:
                echo "<div class='alert alert-danger' role='alert'>Erro ao excluir registro!</div> ";
            endif;

            echo "<meta http-equiv=refresh content='3;URL=index.php'>";
        endif;
        ?>

    </div>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aff... e o erro persiste...

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /home/guard714/public_html/marcelojesus/menu/action_voluntarios.php:83 Stack trace: #0 /home/guard714/public_html/marcelojesus/menu/action_voluntarios.php(83): PDOStatement->execute() #1 {main} thrown in /home/guard714/public_html/marcelojesus/menu/action_voluntarios.php on line 83

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 horas atrás, Gabrielvt14 disse:

Tenta jogar o bindValue do ID por ultimo (   $sql .= 'WHERE id = :id';  ). Em baixo do  $stm->bindValue(':motivo', $motivo);

 

O erro diz que o parâmetro numérico esta indefinido... talvez seja porque você colocou o ID por ultimo na query, e na hora do bindValue ele coloca por ultimo o ':motivo' . Ai ele entende que este ultimo bindValue deve ser numerico, visto que no banco o ID deve estar como tipo INT.

 

Tenta aí e qualquer coisa da um grito aqui man!

 

Ele pegou os dados do primeiro cadastro e copiou por cima de todos os outros. Tipo, tenho 45 pessoas cadastradas. Ele copiou os dados do primeiro ID e subsistiu as outras 44. O mais engraçado é que utilizo estes códigos normalmente para outros DB.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabrielvt14  Aproveitei sua sugestão e acrescentei    $stm->bindValue(':id', $id);  , mantendo o $sql .= 'WHERE id = :id';  lá na parte superior. Pelo PhpMyAdmin, verifiquei que algumas colunas estavam desmarcadas como "nulo" sendo que os campos podem sim ser nulos. Com estas mudanças e passando tudo para utf8_unicode_ci, agora sim consigo editar conforme planejado. Agradeço a todos vcs pelas orientações. Ainda sou iniciante no assunto. Ficou assim:

 

$sql .= ' WHERE id = :id ';

            $stm = $conexao->prepare($sql);
            $stm->bindValue(':id', $id);
            $stm->bindValue(':nome', $nome);
            $stm->bindValue(':belo_horizonte', $belo_horizonte);
            $stm->bindValue(':evangelico', $evangelico);
            $stm->bindValue(':paulo_tarso', $paulo_tarso);
            $stm->bindValue(':abc', $abc);
            $stm->bindValue(':nossa_senhora', $nossa_senhora);
            $stm->bindValue(':alberto_cavalcanti', $alberto_cavalcanti);
            $stm->bindValue(':indisponivel', $indisponivel);
            $stm->bindValue(':motivo', $motivo);
            $retorno = $stm->execute();

 

Erro resolvido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por Carlos Web Soluções Web
      Olá...
      Estou tentando fazer o seguinte !!
      Listando dados em tabela !!
      Gostaria que....se na listagem houver 4 linhas...indepedente de seu número de ID, faça a listagem em ID ser em ordem 1 2 3 4 !!
      Exemplo...se tiver uma listagem de dados que está em ID 1 3 3...faça ficar 1 2 3 !!

       
      echo "<table class='tabela_dados' border='1'> <tr> <td>ID</td> <td>Nome Empresa</td> <td>Responsável</td> <td>Telefone 1</td> <td>Telefone 2</td> <td>E-mail 1</td> <td>E-mail 2</td> <td>Endereço</td> <td>CEP</td> <td>Bairro</td> <td>AÇÃO 1</td> <td>AÇÃO 2</td> </tr> "; $sql = "SELECT ID FROM usuarios_dados WHERE Usuario='$usuario'"; $result = $conn->query($sql); $num_rows = $result->num_rows; $Novo_ID = 1; for ($i = 0; $i < $num_rows; $i++) { $registro = $result -> fetch_row(); $sql2 = "UPDATE usuarios_dados SET ID='$Novo_ID' WHERE ID='$Novo_ID'"; $result2 = $conn->query($sql2); $Novo_ID++; } $sql = "SELECT * FROM usuarios_dados"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr> <td>$row[ID]</td> <td>$row[Nome_Empresa]</td> <td>$row[Responsavel]</td> <td>$row[Telefone_1]</td> <td>$row[Telefone_2]</td> <td>$row[Email_1]</td> <td>$row[Email_2]</td> <td>$row[Endereço]</td> <td>$row[CEP]</td> <td>$row[Bairro]</td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> "; } } else { echo "0 results"; } $conn->close();  
    • Por ILR master
      Boa tarde pessoal, tudo bem ?
       
      Eu uso o tinymce para cadastro de textos no meu siite, porém, quero fazer um sistema para que os colunistas possam fazer o próprio post.
      O problema do tinymce, é que ele mantém a formatação do texto copiado, como tamanho de fonts, negritos, etc... Quero que o usuário cole o texto e a própria textarea limpe a formatação para que ele formate como quiser.
       
      A pergunta é:
       
      O tinymce tem uma opção para desabilitar a formatação quando um texto é colocado?
      Tem alguma função via java ou php para retirar a formatação assim que o texto é colado?
      Ou é melhor usar um outro editor?
       
      Agradeço deste já.
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.