【问题标题】:Ajax request and copy some rows with php pdo but change some valuesAjax 请求并使用 php pdo 复制一些行但更改一些值
【发布时间】:2014-04-03 21:04:33
【问题描述】:

我有这个数据库:

我有这个 ajax 请求:

$("#noviDatum").click(function() {
    var nd = $('#nD').val();
    $.ajax({
            url: "addDate.php",
            type: "POST",
            async: true, 
            data: {ajdi:ajdi,nd:nd}, //your form data to post goes here as a json object
            dataType: "html",

            success: function(data) {
            console.log(data);   
            },  
        });


});

所以 ajdi = id_akt

现在我想在运行addDate.php 时复制所有行where id_akt = ajdi and where prvi = 1,但随后我需要将datum 更改为使用nd 值(也是日期)和vrednost to 0 处理的行。

是否有可能做到这一点以及如何做到这一点?还有这种方法如何保存?你有什么建议?

更新: 我用 php pdo 试试这个,但出了点问题:

try {
      $conn = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $rez = $conn->prepare("SELECT * FROM track_aktivnosti WHERE id_akt = :id_akt AND prvi=1");
      $rez->execute(array(':id_akt' => $_POST['id_akt']));
      $kol = $rez->fetchAll();


foreach ($kol as $r) {
    $STH = $conn->prepare("INSERT INTO track_aktivnosti (datum, prvi, id_akt, tabela, id_tabele, naziv, vrednost) VALUES ($r['datum'], 0, :id_akt, $r['tabela'], $r['naziv'], 0)");
          $STH->execute(array(':id_akt' => $_POST['id_akt']));


$STH->execute();
}


    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }

    ?>

【问题讨论】:

  • prvi 列上新行的值也需要为 0

标签: php jquery mysql ajax pdo


【解决方案1】:

好吧,首先,我假设您的 addDate.php 已经实现了与 mysql 数据库通信的基本逻辑,并且您是一个优秀的编码器,并检查 ajax 帖子传递的所有值是否有任何恶意输入.

然后您基本上首先需要检索要复制和修改的行:

...
$ajdi = $_POST['ajdi'];
$nd = $_POST['nd'];
...

$select_rows = query("SELECT * FROM your_table WHERE `id_akt`= $ajdi AND `id_akt`= 1") or die(mysql_error());

while($data = fetch_assoc($select_rows))
{
    //we'll handle this in the next section
}
... 

检索到行后,您需要相应地更改每行数据,然后将其重新插入表中。

...
while($data = fetch_assoc($select_rows))
{
     $insert_row = query("INSERT INTO your_table (datum, prvi, other cols..) VALUES ($nd, $data['prvi'], other values...)");

     if ($insert_row) {
         /// Delete old row if needed by using $data['id']
     }
}
...

如果您需要任何其他信息,请告诉我。

更新: 我对您更新的代码进行了一些更改并添加了一些错误回显以查看是否出现问题,但为了进一步澄清错误所在,您肯定需要调试您的代码:

try {
      // Check if value is set
      $id_akt = $_POST['id_akt'];
      echo "Passed id: " . $id_akt . "\r\n";

      $conn = new PDO("mysql:host=localhost;dbname=" . $dbname, $username, $password);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $rez = $conn->prepare("SELECT * FROM track_aktivnosti WHERE id_akt = :id AND prvi=1");
      $rez->bindValue(':id', $id_akt, PDO::PARAM_INT);
      $rez->execute();
      //$data = $rez->fetchAll(PDO::FETCH_ASSOC);

      while($r = $rez->fetch(PDO::FETCH_ASSOC)) {

          // Check if we are in loop
          echo "Processing row data:";
          print_r($r);
          echo "\r\n";

          $STH = $conn->prepare("INSERT INTO track_aktivnosti (datum, prvi, id_akt, tabela, id_tabele, naziv, vrednost) VALUES (:r_datum, 0, :id_akt, :r_tabela, 0, :r_naziv, 0)");

          $STH->execute(array(':r_datum' => $r['datum'],':id_akt' => $id_akt, ':r_tabela' => $r['tabela'], ':r_naziv' => $r['naziv'] ));

          $affected_rows = $STH->rowCount();

          echo "Affected rows: " . $affected_rows;
          echo "\r\n";
          echo "\r\n";
     }


} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

显然您的版本存在一些问题:

  • Select 调用已准备好,但据我所知从未执行。
  • 在插入命令中,如果准备查询,则应在执行时传递所有变量(或之前绑定它们)
  • 您的第二个查询缺少 *id_table* 的值
  • 您重复执行了插入命令。

大多数问题通常可以通过花时间思考刚刚写的内容并仔细检查逻辑错误来解决。

希望这会有所帮助。

【讨论】:

  • 请注意,代码不完整。您需要插入自己的值并根据需要完成查询。
  • 注意:您应该避开 mysql_* 函数,因为它已被贬值。查看PDOMySQLi
  • 这在 php PDO 中会是什么样子?
  • 我用 PHP PDO 代码更新了我的问题,但有些地方有问题
  • 现在在检查错误后我得到这个:传递的 id:25 处理行数据:数组([ID] => 192 [datum] => 2013-04-01 [prvi] => 1 [id_akt ] => 25 [tabela] => zalihe [id_tabele] => 1 [naziv] => gorivo biodizel [vrednost] => 0)错误:SQLSTATE [23000]:完整性约束违规:1062 重复条目'2013-04-01 -25-zalihe-1-gorivo biodizel' 用于关键 'track_aktivnosti_5cols'
猜你喜欢
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2015-04-26
  • 2019-02-05
相关资源
最近更新 更多