Display MySQL PHP Errors Correctly

2

Hello, I have a simple registration form, where repeated records can not exist in the cpf field and also in the resposta(cupom) field. The validation of cpf is ok and the data does not duplicate in MySQL, but the verification and return of the errors is faulty. Here is 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');
    
asked by anonymous 26.09.2014 / 19:18

2 answers

3

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

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

$Result1 = mysql_query( ... query desejada ... );

$erro = mysql_errno();

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% required% as compared to the mysql error codes .

Toast, with this solution you can eliminate the die() extra you currently use just to test this condition.

Note: This example is good for the fact that elseif is only in the CPF and Message. If you have more columns SELECT , put a larger message in unique , or check the column that triggered its error.

And take the time to fix your code urgently using unique functions instead of that improvisation with elseif

    
26.09.2014 / 22:38
0

It worked, the solution follows:

$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
}

Thanks for the help! I have to learn a lot, but slowly we get there.

    
01.10.2014 / 00:32