Display Mysql PHP errors correctly

Asked

Viewed 2,789 times

4

Hello, I have a simple registration form, where there can be no repeated records in the field cpf and also in the field resposta(cupom). The validation of cpf is ok and the data does not duplicate in Mysql, but the check and error return is failed. Follow the code:

<?php require_once('Connections/conecta.php'); ?>
<?php
ini_set('display_errors', 0 );
error_reporting(0);

if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
$data = date("Y-m-d");

function validaCPF($cpf)
{   // Verifiva se o número digitado contém todos os digitos
$cpf = str_pad(ereg_replace('[^0-9]', '', $cpf), 11, '0', STR_PAD_LEFT);
// Verifica se nenhuma das sequências abaixo foi digitada, caso seja, retorna falso
if (strlen($cpf) != 11 || $cpf == '00000000000' || $cpf == '11111111111' || $cpf == '22222222222' || $cpf == '33333333333' || $cpf == '44444444444' || $cpf == '55555555555' || $cpf == '66666666666' || $cpf == '77777777777' || $cpf == '88888888888' || $cpf == '99999999999')
{
return false;
}
else
{ // Calcula os números para verificar se o CPF é verdadeiro
for ($t = 9; $t < 11; $t++) {
for ($d = 0, $c = 0; $c < $t; $c++) {
$d += $cpf{$c} * (($t + 1) - $c);
}

$d = ((10 * $d) % 11) % 10;

if ($cpf{$c} != $d) {
return false;
}
}

return true;
}
}
$cpf = $_POST['cpf'];

$resposta = $_POST['resposta'];


$search = mysql_query("SELECT * FROM membros WHERE cpf = '$cpf' OR resposta = '$resposta'");
if(@mysql_num_rows($search) >= 1){
echo '<p align="center">Registro não efetuado!<br /> Cada CPF ou Cupom, só pode ser cadastrado uma vez. O CPF precisa ser válido.</p>';
}
elseif ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
    if(isset($_POST['btvalidar']))
{// Adiciona o numero enviado na variavel $cpf_enviado, poderia ser outro nome, e executa a função acima
$cpf_enviado = validaCPF($_POST['cpf']);
// Verifica a resposta da função e exibe na tela
if($cpf_enviado == true) {
echo "CPF Válido";
$insertSQL = sprintf("INSERT INTO membros (id, nome, cpf, email, resposta, data) VALUES (%s, %s, %s, %s, %s, NOW())",
                       GetSQLValueString($_POST['id'], "int"),
                       GetSQLValueString($_POST['nome'], "text"),
                       GetSQLValueString($_POST['cpf'], "text"),
                       GetSQLValueString($_POST['email'], "text"),
                       GetSQLValueString($_POST['resposta'], "text"),
                       GetSQLValueString($_POST['data'], "date"));

  mysql_select_db($database_conecta, $conecta);
  $Result1 = mysql_query($insertSQL, $conecta) or die(mysql_error());
    echo '<p align="center">Registro efetuado com sucesso!</p>';
}
elseif($cpf_enviado == false)
echo "CPF Inválido.";
}

}

// Verifica se o botão de validação foi acionado

/*function srange ($s) {
  //preg_match_all("/([0-9]{1,2})-?([0-9]{0,2}) ?,?;?/", $s, $a);
  $n = array ();
  foreach ($a[1] as $k => $v) {
    $n  = array_map(function($n) { return sprintf('RS%03d', $n); }, range(0000001, 1000000));
  }
  return ($n);
}

$s = 'RS0000001-RS1000000';
print_r(srange($n));*/
//$k = array(range(1000000,9000000));



// print_r($k);    

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Documento sem título</title>

</head>

<body>
<script type="text/javascript">
function validaCampo()
{
if(document.form1.nome.value=="")
    {
    alert("O Campo nome é obrigatório!");
    return false;
    }
    else
    if(document.form1.cpf.value=="")
    {
    alert("O Campo CPF é obrigatório!");
    return false;
    }
else
    if(document.form1.email.value=="")
    {
    alert("O Campo email é obrigatório!");
    return false;
    }
    else
    if(document.form1.resposta.value=="")
    {
    alert("O Campo Cupom é obrigatório!");
    return false;
    }
else
    if(document.form1.telefone.value=="")
    {
    alert("O Campo Telefone é obrigatório!");
    return false;
    }
else
    if(document.form1.bairro.value=="")
    {
    alert("O Campo Bairro é obrigatório!");
    return false;
    }
else
    if(document.form1.pais.value=="")
    {
    alert("O Campo país é obrigatório!");
    return false;
    }
else
    if(document.form1.login.value=="")
    {
    alert("O Campo Login é obrigatório!");
    return false;
    }
else    
if(document.form1.senha.value=="")
    {
    alert("Digite uma senha!");
    return false;
    }
else
return true;
}
<!-- Fim do JavaScript que valida os campos obrigatórios! -->
</script>

<form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1" onsubmit="return validaCampo(); return false;">
  <table align="center">
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Nome:</td>
      <td><input type="text" name="nome" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Cpf:</td>
      <td><input type="text" name="cpf" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Email:</td>
      <td><input type="text" name="email" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Resposta:</td>
      <td><input type="text" name="resposta" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">&nbsp;</td>
      <td><input name="btvalidar" type="submit" id="btvalidar" value="Inserir registro" /></td>
    </tr>
  </table>
  <input type="hidden" name="id" value="" />
  <input type="hidden" name="data" value="" />
  <input type="hidden" name="MM_insert" value="form1" />
</form>
<p>&nbsp;</p>
<?php 
?>
</body>
</html>

And the Mysql table:

--
-- Estrutura para tabela `membros`
--

CREATE TABLE IF NOT EXISTS `membros` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `cpf` varchar(11) NOT NULL,
  `data` date NOT NULL,
  `resposta` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `cpf` (`cpf`),
  UNIQUE KEY `resposta` (`resposta`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

--
-- Fazendo dump de dados para tabela `membros`
--

INSERT INTO `membros` (`id`, `nome`, `email`, `cpf`, `data`, `resposta`) VALUES
(32, 'Marcos Felipe', '[email protected]', '22554477889', '2014-09-26', 'RS0000001'),
(33, 'Marcos Felipe', '[email protected]', '02545596985', '2014-09-26', 'RS0000002');
  • If you want to display code errors let the display_errors as true and the error_reporting as E_ALL. Could you give more details of this failure?

  • For example, if I try to insert a duplicate Cpf, instead of showing the error "Registration not done! <br /> Each CPF or Coupon, can only be registered once. The CPF must be valid." mysql default error message is displayed "Duplicate entry 'xxxxxxxxxxxx' for key 'Cpf'"

  • The localhost is working, but when it goes up to hosting, it’s not right.

  • Which version of php you’re using on the web host? ereg_* for example was depreciated in php5.3.

  • 1

    PHP Version 5.2.17

  • See in the consultation if $cpf or $resposta are not going with spaces, use trim() to remove them.

  • Nothing, the data goes correctly and when mysql realizes the duplicity, returns the error "Duplicate entry 'xxxxxxxxxxxx' for key 'Cpf'" and does not insert the data, which is correct, cannot duplicate. But I wanted to show the error that is in php code and not mysql default.

Show 2 more comments

2 answers

3

What is happening is that on the current server the CPF column is with unique, so Mysql is not letting you enter the data. If you remove the unique of the index, your if test original will work.

If you want to customize the errors and keep the unique, what is the ideal way, should draw the line with the die() which is the one that puts the original error on the screen, and uses something like this in place:

$Result1 = mysql_query( ... query desejada ... ); // mysqli_query($con, query)

$erro = mysql_errno(); // mysqli_errno($con); para mysqli, é ideal trocar o quanto antes.

if ($erro == 0) {
    echo '<p align="center">Registro efetuado com sucesso!</p>';
} elseif ($erro == 1062) { // ou 1586, teste. Verifique a versão do MySQL usado
    echo '<p align="center">Esse CPF ou Mensagem já existe(m) na base de dados</p>';
} elseif ($erro == 2) {    // Este é só um exemplo, personalize como quiser:
    echo '<p align="center">Erro personalizado 2</p>';
} else {
    echo '<p align="center">Erro MySQL #'.$erro.'</p>';
}

Then just customize the messages for the desired errors with the elseif necessary compared with the Mysql error codes.

From "toast", with this solution you can eliminate the SELECT extra that you currently only use to test this condition.

Note: this example serves well for the case of unique be only in CPF and Message. If you have more columns unique, put a broader message on elseif, or check which column triggered the error.

And take the opportunity to fix your code urgently using functions mysqli_ instead of that improvisation with function exists

  • It worked, follow the solution:

0

It worked, follow the solution:

$Result1 = mysql_query($insertSQL, $conecta); //or die(mysql_error());
  if ($erro == 0) {
    echo '<p align="center">Registro efetuado com sucesso!</p>';
}
  elseif (mysql_errno() == 1060)
{
    echo '<p align="center">Esse CPF ou Mensagem já existe(m) na base de dados.</p>'; // coloque a mensagem aqui
}
elseif (mysql_errno() == 1061)
{
    echo '<p align="center">Esse CPF ou Mensagem já existe(m) na base de dados.</p>'; // coloque a mensagem aqui
}
elseif (mysql_errno() == 1062)
{
    echo '<p align="center">Esse CPF ou Cupom já existe(m) na base de dados.</p>'; // coloque a mensagem aqui
}

Thank you so much for the help! I have to learn a lot yet, but gradually we get there.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.