PHP Array POST UPDATE 只影响最后一行

标签 php mysql arrays database pdo

我正在尝试UPDATE 我的DB 的多行,但它只UPDATE 最后一行。

我从数据库中获取了所有DATA并填写了SELECT OPTION MULTIPLE:

<select name="numerosdasorte[]" class="form-control" multiple="">

  <?php
    $consulta = $PDO->query("SELECT * FROM cota1 WHERE status = '0' ORDER BY cota ASC");
    while ($linha = $consulta->fetch(PDO::FETCH_ASSOC)) {
  ?>

 <option value="<?php echo $linha['cota']; ?>"><?php echo $linha['cota']; ?></option>

 <?php } ?>

</select>

我得到了这些数字并在保存数据之前输入了“,”:

$numerosdasorte = '';
foreach ($_POST['numerosdasorte'] as $numeros) {
    $numerosdasorte .= ',' . $numeros;
}

$numerosdasorte = ltrim($numerosdasorte, ',');

INSERT DATABASE 上的数据。它像我想要的那样工作:

$sql = "INSERT INTO users SET name = :name, email = :email, password = :password, endereco = :endereco, numero = :numero, bairro = :bairro, cep = :cep, cidade = :cidade, estado = :estado, telefonefixo = :telefonefixo, telefonecelular = :telefonecelular, datadenascimento = :datadenascimento, cpfcnpj = :cpfcnpj, rg = :rg, numerosdasorte = :numerosdasorte";

现在,我遇到了问题:我需要获取在表单中选择的号码以更改此状态。选择的所有数字,我需要更改为“1”。所有选择的号码都需要不可用:

$exploded = explode(",", $numerosdasorte);
foreach( $exploded as $key => $value ) {
    $query = "UPDATE cota1 SET status = '1' WHERE cota = $value";
    $stmt = $PDO->prepare($query);
}

问题是,唯一受影响的行是最后一行。如果我选择 5 个号码,例如(001、002、003、004 和 005),只有最后一个号码 (005) 会受到影响并更改为“1”。

完整代码:

<?php

require '../config.a/conexao.php';

$name = $_POST['name'];
$email = $_POST['email'];
$password = md5(uniqid(""));
$endereco = $_POST['endereco'];
$numero = $_POST['numero'];
$bairro = $_POST['bairro'];
$cep = $_POST['cep'];
$cidade = $_POST['cidade'];
$estado = $_POST['estado'];
$telefonefixo = $_POST['telefonefixo'];
$telefonecelular = $_POST['telefonecelular'];
$datadenascimento = $_POST['datadenascimento'];
$cpfcnpj = $_POST['cpfcnpj'];
$rg = $_POST['rg'];

$numerosdasorte = '';
foreach ($_POST['numerosdasorte'] as $numeros) {
    $numerosdasorte .= ',' . $numeros;
}

$numerosdasorte = ltrim($numerosdasorte, ',');

$sql = "INSERT INTO users SET name = :name, email = :email, password = :password, endereco = :endereco, numero = :numero, bairro = :bairro, cep = :cep, cidade = :cidade, estado = :estado, telefonefixo = :telefonefixo, telefonecelular = :telefonecelular, datadenascimento = :datadenascimento, cpfcnpj = :cpfcnpj, rg = :rg, numerosdasorte = :numerosdasorte";

$stmt = $PDO->prepare($sql);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':endereco', $endereco);
$stmt->bindParam(':numero', $numero);
$stmt->bindParam(':bairro', $bairro);
$stmt->bindParam(':cep', $cep);
$stmt->bindParam(':cidade', $cidade);
$stmt->bindParam(':estado', $estado);
$stmt->bindParam(':telefonefixo', $telefonefixo);
$stmt->bindParam(':telefonecelular', $telefonecelular);
$stmt->bindParam(':datadenascimento', $datadenascimento);
$stmt->bindParam(':cpfcnpj', $cpfcnpj);
$stmt->bindParam(':rg', $rg);
$stmt->bindParam(':numerosdasorte', $numerosdasorte);

$exploded = explode(",", $numerosdasorte);
foreach( $exploded as $key => $value ) {
    $query = "UPDATE cota1 SET status = '1' WHERE cota = $value";
    $stmt = $PDO->prepare($query);
}

$result = $stmt->execute();

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

    $subjectPrefix = '[Você foi cadastrado na TOP BRASIL]';
    $assunto = 'Você foi cadastrado na TOP BRASIL';
    $mensagemHTML = '<h3>Parabéns por fazer parte do nosso GRUPO COOPERATIVO!</h3>
      <p>Olá <b>' . $name . '</b>, você fez uma ótima escolha! Acompanhe os sorteios e boa sorte! <br> Agora você está habilitado a acompanhar todo o processo por seu PAINEL de cliente. Para acessar, é muito simples: <br> Acesse nosso site (https://topbrasilbr.com.br/painel), digite seu usuário e senha, e pronto! Fique por dentro das novidades! <br><br> Segue seus dados de cadastro:
      <p><b>E-mail:</b> ' . $email . ' <br> <b>Senha:</b> ' . $password . '
      <p>Para dúvidas, entre em contato conosco, pelo telefone (24) 2252-3196, ou pelo e-mail: contato@topbrasilbr.com.br.
      <p>Um grande abraço!
      <p><b>Equipe TOP BRASIL</b>
      <hr>';

    $headers = "MIME-Version: 1.1\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: TOP BRASIL\r\n";
    $headers .= 'Cc: contato@topbrasilbr.com.br' . "\r\n";
    $headers .= "Return-Path: $email \r\n";
    $envio = mail($email, $assunto, $mensagemHTML, $headers);

    if ($envio)
        echo "<script>alert('Cadastro realizado com sucesso!'); window.top.location.href = 'index.php';</script>";
}

exit;
?>

最佳答案

对于您的第一个插入查询,您永远不会执行它。没有正在创建记录。第二,你用不同的值一遍又一遍地准备一个语句,但你只在它结束时执行一次。使用准备好的语句的主要原因之一是您不会像现在这样将用户数据直接放入 SQL。

除此之外,您的整个脚本还可以大大缩短。

<?php

require '../config.a/conexao.php';

// I don't know what you're doing here, but it's not good
$_POST["password"] = md5(uniqid(""));

// here just turn post into your parameters by prefixing key with :
foreach ($_POST as $k=>$v) {
    $params[":$k"] = $v;
}
// this is a special case, but the fact that it's here means
// your database structure is no good and needs normalizing
$params[":numerosdasorte"] = implode($_POST["numerosdasorte"], ',');

// prepare the statement
$stmt = $PDO->prepare(
    "INSERT INTO users SET name = :name, email = :email, password = :password, endereco = :endereco, numero = :numero, bairro = :bairro, cep = :cep, cidade = :cidade, estado = :estado, telefonefixo = :telefonefixo, telefonecelular = :telefonecelular, datadenascimento = :datadenascimento, cpfcnpj = :cpfcnpj, rg = :rg, numerosdasorte = :numerosdasorte"
);

// no need to bind parameters, just include them as an array in the execution
$result = $stmt->execute($params);

// again, prepare a statement
$stmt = $PDO->prepare("UPDATE cota1 SET status = 1 WHERE cota = ?");
foreach($_POST["numerosdasorte"] as $value ) {
    // execute it repeatedly
    $stmt->execute([$value]);
}

if (!$result) {
    // don't show users this stuff
    var_dump($stmt->errorInfo());
} else {
    // send your email
}

关于PHP Array POST UPDATE 只影响最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894051/

相关文章:

arrays - 如何在 PostgreSQL 中使用数组作为参数进行递归选择

python - 一维数组和二维数组之间的逐行笛卡尔积

c++ - 在初始化列表中从 float* 设置 double[]

php - Twitter 应用程序开发 : PHP or javascript. ..请帮助

php - PDO 数据库不返回行,只返回查询字符串(pdo 对象)

python - django.db.utils.operationalError : (2059 ,"Authentication Plugin ' caching_sha2_password'")

php - 另一个小错误(可能很明显)

php - 动态下拉列表在每个项目之前显示短语

php - 长轮询技术或任何其他方法

php - 设置 HTTP 请求 "Content-Type"