【问题标题】:Limit to post for sql?限制为 sql 发帖?
【发布时间】:2017-03-21 05:14:50
【问题描述】:

我需要更新一个包含 14 个帖子变量的表。当我用 2 个变量做完全相同的事情时,它工作正常,但是当我使用 14 时它不会更新。我已经尝试了代码的各种变体,这是我的最新版本,它不起作用,但也没有给我错误。是不是因为我有很多post变量,当我打印它们时它们都是正确的。

<?php print_r($_POST); ?>
<?php

$v = array();
$v[0] = $_POST['id'];
$v[1] = $_POST['first_name'];
$v[2] = $_POST['last_name'];
$v[3] = $_POST['address1'];
$v[4] = $_POST['address2'];
$v[5] = $_POST['address3'];
$v[6] = $_POST['address4'];
$v[7] = $_POST['no'];
$v[8] = $_POST['type'];
$v[9] = $_POST['reference'];
$v[10] = $_POST['relationship'];
$v[11] = $_POST['occupation'];
$v[12] = $_POST['comments'];
$v[13] = $_POST['source'];

$dbh = dbh_get();

$sql = "UPDATE transfer SET (first_name, last_name, address1, address2, address3, address4, no, type, reference, relationship, occupation, comments, source) VALUES ('.$v[1].','.$v[2].','.$v[3].','.$v[4].','.$v[5].','.$v[6].','.$v[7].','.$v[8].','.$v[9].','.$v[10].','.$v[11].','.$v[12].','.$v[13].') WHERE transfer_id='.$v[0].'";
$stmt = $dbh->prepare($sql);
$stmt->execute($v);

dbh_free($dbh)
?>

最初我没有使用引号而只是使用撇号,并且 id 最后而不是第一个,但也没有工作。像这样:-

$sql = 'UPDATE transfer SET first_name=?, last_name=?, address1=?, etc,..... WHERE id=?';

当它只有两个 post 变量时,这工作正常,但当我放大它时,它就坏了。

【问题讨论】:

    标签: php sql postgresql post


    【解决方案1】:

    几个建议:

    1. 您可以在运行时更改 php 配置。如果您没有看到错误,您可以打开 display_errors 选项。

      ini_set('display_errors','1');

    2. 使用 try-catch 获取错误堆栈
    3. 打印在屏幕上构建的查询以查看其中是否有任何错误。直接使用打印在mysql终端屏幕上的查询来检查它是否抛出任何错误
    4. 使用addslashes() 转义要更新的值中的特殊字符
    5. 数字(int、bigint、tinyint 等)不需要在查询中用引号括起来
    6. 使用 PDO 和准备好的语句是执行数据库操作的更好方法

    只要查询正确形成,执行中就不应该出现问题(不管使用的 post 变量的数量)。

    您已使用双引号开始查询字符串,但在连接时使用单引号。看看改变是否有助于解决问题:

    $query = "UPDATE transfer SET pay_first_name ='".$v[1]."'";
    

    或者

    $query = "UPDATE transfer SET pay_first_name ='".addslashes($v[1])."'";
    

    【讨论】:

      【解决方案2】:

      试试这样的准备好的语句

      $stmt = $dbh->stmt_init();
      $stmt->prepare("UPDATE transfer SET first_name = ?, last_name = ?, address1 = ?, address2 = ?, address3 = ?, address4 = ?, no = ?, type = ?, reference = ?, relationship = ?, occupation = ?, comments = ?, source = ? WHERE id = ?");
      $stmt->bind_param("sssssssssssssi", $v[1], $v[2], $v[3], $v[4], $v[5], $v[6], $v[7], $v[8], $v[9], $v[10], $v[11], $v[12], $v[13], $v[0]);
      $stmt->execute() or die($stmt->error);
      $stmt->close();
      

      【讨论】:

        【解决方案3】:

        尝试像这样更新查询

            $sql = "UPDATE transfer SET
             pay_first_name = '".$v[1]."',
             pay_last_name  = '".$v[2]."',
              pay_address1  = '".$v[3]."', 
              pay_address2 = '".$v[4]."', 
              pay_address3 = '".$v[5]."', 
              pay_address4 = '".$v[6]."', 
              pay_contact_no = '".$v[7]."', 
              pay_id1_type = '".$v[8]."', 
              pay_id1_reference = '".$v[9]."', 
              relationship = '".$v[10]."', 
              occupation = '".$v[11]."', 
              comments = '".$v[12]."', 
              source = '".$v[13]."' WHERE transfer_id ='.$v[0];
        

        【讨论】:

        • 给我一个错误,除非我做第一位'更新......和最后一位 WHERE transfer_id="'.$v[0].'"';那么没有错误但不更新表
        猜你喜欢
        • 2023-03-25
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 2011-07-06
        • 1970-01-01
        • 2011-01-22
        相关资源
        最近更新 更多