How to use sprintf to mount a SQL query? [closed]

0

What is the correct way to use sprintf in mysqli and make the return IF?

$rs = $mysqli->query(sprintf("INSERT INTO perguntas (chave, nome, email, idade, estado_civil, profissao, religiao, assunto, pergunta, 'data') VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                        mysqli_real_escape_string($chave),
                        mysqli_real_escape_string($_POST['nome']),
                        mysqli_real_escape_string($_POST['email']),
                        mysqli_real_escape_string($_POST['idade']),
                        mysqli_real_escape_string($_POST['estado_civil']),
                        mysqli_real_escape_string($_POST['profissao']),
                        mysqli_real_escape_string($_POST['religiao']),
                        mysqli_real_escape_string($_POST['assunto']),
                        mysqli_real_escape_string($_POST['pergunta']),
                        mysqli_real_escape_string($data)));

    if (mysqli_query($rs)) {
        echo "<script>window.location = '".$baseURL."/enviar-aconselhamento&chave=$chave'</script>";
    }else{
        die('Error: ' . mysqli_error($mysqli));
    }

That way I'm doing above this by returning error:

  

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',)' at line 1

    
asked by anonymous 04.01.2016 / 13:06

2 answers

1

I've changed the name of your bank date field, because the word "date" is a reserved MySQL variable, and should not be used as a field name. It is not necessary to use the function sprintf() , mysqli already has the necessary treatment, for values through preparedStatment :

$data = array(
              'chave' => mysqli_real_escape_string($chave),
              'nome'  => mysqli_real_escape_string($_POST['nome']),
              'email' => mysqli_real_escape_string($_POST['email']),
              'idade' => mysqli_real_escape_string($_POST['idade']),
              'estado_civil' => mysqli_real_escape_string($_POST['estado_civil']),
              'profissao' => mysqli_real_escape_string($_POST['profissao']),
              'religiao' => mysqli_real_escape_string($_POST['religiao']),
              'assunto' => mysqli_real_escape_string($_POST['assunto']),
              'pergunta => 'mysqli_real_escape_string($_POST['pergunta']),
              'data_pub' => mysqli_real_escape_string($data_pub)
            );

$query = "INSERT INTO perguntas ('chave',
                                 'nome',
                                 'email',
                                 'idade',
                                 'estado_civil',
                                 'profissao',
                                 'religiao',
                                 'assunto',
                                 'pergunta',
                                 'data_pub')
          VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";

$stmt = $mysqli->prepare($query);
$stmt ->bind_param("ssssssssss", $data['chave'],$data['nome'],$data['email'],$data['idade'],$data['estado_civil'],$data['profissao'],$data['religiao'],$data['assunto'],$data['pergunta'],$data['data_pub']);
$action = $stmt->execute();
$stmt->close();
if ($action) {
   echo "<script>window.location.href='{$baseURL}/enviar-aconselhamento&chave={$chave}'</script>";
} else {
  die('Erro: ' . mysqli_error($mysqli));
}
    
04.01.2016 / 14:14
2

First, sprintf() is not related to mysqli() .

Let's get right to the point.

In this section:

$rs = $mysqli->query(sprintf("INSERT INTO perguntas (chave, nome, email, idade, estado_civil, profissao, religiao, assunto, pergunta, 'data') VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                        mysqli_real_escape_string($chave),
                        mysqli_real_escape_string($_POST['nome']),
                        mysqli_real_escape_string($_POST['email']),
                        mysqli_real_escape_string($_POST['idade']),
                        mysqli_real_escape_string($_POST['estado_civil']),
                        mysqli_real_escape_string($_POST['profissao']),
                        mysqli_real_escape_string($_POST['religiao']),
                        mysqli_real_escape_string($_POST['assunto']),
                        mysqli_real_escape_string($_POST['pergunta']),
                        mysqli_real_escape_string($data)));

Replace with this:

$columns = array('chave', 'nome', 'email', 'idade', 'estado_civil', 'profissao', 'religiao', 'assunto', 'pergunta', 'data');
$parameters = array($chave, 'nome', 'email', 'idade', 'estado_civil', 'profissao', 'religiao', 'assunto', 'pergunta', 'data');
$values[] = $chave;
foreach ($parameters as $k => $v)
    $values[] = (isset($_POST[$v])? mysqli_real_escape_string($_POST[$v]) : '');
$values[] = $data;

$sql = 'INSERT INTO table ('.vsprintf("'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s'", $columns).')
 VALUES ('.vsprintf("'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s'", $values).')';

$rs = $mysqli->query($sql);

I used vsprintf () instead of sprintf () / a> because vsprintf () supports array in the second parameter. This makes it easy to add parameters dynamically.

    
04.01.2016 / 13:56