使用 php PDO 从另一个 table 插入行

INSERT row from another table using php PDO

我是 PDO 的新手并且 php。我想用 link 将一行从一个 table 移动到另一个我发送到下面的脚本。

LINK "id" 用作 invtable 中的主键,(请参阅下面脚本中的 FROM invtable)

提交广告-florida.php?id=01820007985

SCRIPT 提交广告-florida.php

<?php
    $host = "localhost";
    $user = "user";
    $password = "pass";
    $database_name = "db";
    $pdo = new PDO("mysql:host=$host;dbname=$database_name", $user, $password, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ));

$barCode = $GET['id'];

$query = "INSERT INTO adstable (Brand, Description, Price, Size, Price, Barcode) 
          SELECT Brand, Description, Price, Size, Price, Barcode FROM invtable 
          WHERE Barcode='".$barCode."'";

$pdo->query($query);
?>

问题

通过 GET[id]) 删除了额外的括号)。我收到以下错误。

致命错误:未捕获异常 'PDOException',消息为“SQLSTATE[42000]:语法错误或访问冲突:1110 列 'Price' 在 /home/myaccount/public_html/florida-ave/submit-ads-florida 中指定了两次”。php:16 堆栈跟踪:#0 /home/myaccount/public_html/florida-ave/submit-ads-florida.php(16): PDO->query('INSERT INTO flo...') #1 {main} throw in /home/myaccount/public_html/florida-ave/submit-ads-florida.php 第 16 行

更新

我更正了价格的多个条目。没有数据被添加到广告table,我没有收到任何错误。

请检查并更正此行:$barCode = $GET['id'];

如果这不是您的解决方案,请告诉我。

好的,所以您 had/have 的问题是:

  • $barCode = $GET['id']); 应该是 $barCode = $GET['id'];,甚至可能是 $_GET['id'];
  • 您的 SELECT 查询选择了同一字段两次 (SELECT Brand, Description, >Price<, Size, >Price<)
  • 您还在同一字段中插入了两次:INSERT INTO adstable (Brand, Description, >Price<, Size, >Price<
  • 您仍然容易受到注入攻击

那么让我们来解决问题:

$barCode = isset($_GET['id']) ? $_GET['id'] : null;//avoids undefined index notice

接下来,要在SELECT查询中两次使用同一个字段,你可以定义一个别名,但你只是不需要同一个字段两次...

SELET SELECT Brand, Description, Price as price_1, Size, Price as price_2, Barcode FROM

然后,为了防止一级注入攻击,让我们使用准备好的语句而不是使用 GET 参数调用 PDO::query

$stmt = $pdo->prepare('INSERT INTO adstable (Brand, Description, Price, Size, Barcode) 
      SELECT Brand, Description, Price, Size, Barcode FROM invtable 
      WHERE Barcode=:barcode'
);
$stmt->execute([':barcode' => $barCode]);

代码应该是这样的:

$barCode = isset($_GET['id']) ? (int) $_GET['id'] : null;
// check $barCode is valid value, if not, don't bother connecting
if ($barCode) {
    $pdo = new PDO(
        sprintf(
            'mysql:host=%s;dbname=%s;charset=utf8', // add charset here!
            $host,
            $dbName
        ),
        $user, $password,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]
    );
    $stmt = $pdo->prepare(
        'INSERT INTO adstable(Brand, Description, Price, Size, Barcode)
         SELECT Brand, Description, Price, Size, Barcode FROM invtable
         WHERE Barcode = :barcode'
    );
    $stmt->execute(
        [
            ':barcode' => $barCode
        ]
    );
}

这应该可以解决问题。但说真的:错误消息 告诉你哪里出了问题 阅读它们