【问题标题】:PHP variables necessary for insertion into SQL statement插入 SQL 语句所需的 PHP 变量
【发布时间】:2012-06-25 15:58:35
【问题描述】:

我已经尝试了几天来获得我希望执行的正确格式。

目标是将行插入到先前创建的 MYSQL 表中。该表可能是字符串和整数的混合,我们知道 MYSQL 需要在字符串周围加上引号才能插入,而整数则不需要。那么,将某些内容插入一个整数和两个字符串的表中的正确方法是:

insert into table values(number, "string", "string");

我希望这些值是 php 变量。但是,当我输入变量时,当我签入 MYSQL 时,代码将不再产生结果。该表将被创建,但它将是空的。所以一定是这个语句不起作用。

这是我插入它的函数的实际代码:

function insertRow($db, $new_table, $ID, $Partner, $Merchant)

    $insert = "INSERT INTO ".$new_table. " VALUES (1,'Partner','Merchant')";

    $q = mysqli_query($db, $insert);

它的工作原理是这样的,但我选择的每一行都用 1、合作伙伴和商家填充整个表格。

我也尝试过这样的几种变体

function insertRow($db, $new_table, $ID, $Partner, $Merchant)

    $insert = "INSERT INTO ".$new_table. " VALUES(" .$ID. "," ."'$Partner'". ","."'$Merchant'".")";

    $q = mysqli_query($db, $insert);

我也试过这些:

Passing PHP variables into MySQL

但没有一个能够将表格实际插入行中。

有没有其他方法可以做到这一点?

【问题讨论】:

  • 没有使用prepared statements的具体原因是什么?
  • 你从数据库中得到错误信息了吗?它会告诉你问题出在哪里。
  • 你可以试试 echo $insert 然后直接在phpmyadmin中执行。请务必检查 mysqli_query 返回的值,如果为假,请打印 $mysqli->error 以获取有关问题的更多信息
  • 此处未显示,但我想您正在加强代码以防止 SQL inj?
  • 同意 PeeHaa,如果您将在表中插入大量数据,则创建字符串不是最好的方法,因为数据库每次重复时都必须解析语句。准备好的语句将只解析一次,即使使用不同的数据,也对后续插入使用相同的语句。此外,如果您打算将数据从某种形式传递给此函数,则准备好的语句将有助于防止 njk 提到的 SQL 注入。

标签: php mysql sql insert


【解决方案1】:

您需要非常简单地开始调试,然后从那里开始工作。我的第一个猜测是您没有正确设置传递给函数的参数值。

试试这个:

function insertRow($db, $new_table, $ID, $Partner, $Merchant) {
  $ID=1;
  $Partner = 'Partner';
  $Merchant = 'Merchant';
  $insert = "INSERT INTO $new_table " .
    " VALUES($ID,'$Partner','$Merchant')";
  $q = mysqli_query($db, $insert);
  if (!$q) die(mysqli_error($db));
}

这行得通吗?如果是这样,那么问题是您的参数值设置不正确。

请注意,我还在其中添加了一些错误报告;-)

但请注意,这样创建 SQL 并不是一个好主意。它对 SQL 注入开放。更好地研究使用准备好的语句:

  $prep = mysqli_prepare($db, "insert into " . $new_table . " values (?,?,?)");
  $prep->bind_param("iss", $ID, $Partner, $Merchant);
  $prep->execute();

有关详细信息,请参阅PHP documentation on mysqli_prepare

【讨论】:

  • 我尝试使用你的第二位,它似乎也不起作用。
  • 好吧,让我们从第一位开始(设置参数值)——这行得通吗?
  • 是的。谢谢!不过我也对另一部分感兴趣,让它更安全一点似乎不错。
  • 太好了 - 好吧,我猜问题是你的参数设置不正确?
  • 不,我真的认为这只是语法问题。我认为你的转义字符在与 sql 混合时使用了正确的方法
【解决方案2】:

您的 INSERT 查询看起来非常接近。我相信您的问题可能是由于没有终止 SQL 语句:

$insert = "INSERT INTO " . $new_table . 
   " VALUES(" . $ID . ", '$Partner', '$Merchant');";

注意多余的分号 (;),关闭 SQL 语句。

【讨论】:

    【解决方案3】:

    PHP 有一个特性,允许您将变量放入双引号字符串中。尝试运行查询:

    function insertRow($db, $new_table, $ID, $Partner, $Merchant)
        $insert = "INSERT INTO $new_table VALUES ($ID,'$Partner','$Merchant');";
        $q = mysqli_query($db, $insert);
    

    这样做的原因是 PHP 解析双引号字符串来进行变量替换。

    【讨论】:

      【解决方案4】:

      尝试使用 PDO 准备好的语句。它使参数变得简单:

      function insertRow($db, $new_table, $ID, $Partner, $Merchant) {
         $host = 'host';
         $user = 'user';
         $password = 'password';
         $pdo = new PDO("mysql:host=$host;dbname=$db", $user, $password);
         $sql = "INSERT INTO $new_table VALUES (:id, :partner, :merchant)";
         $stmt = $pdo->prepare($sql);
         $stmt->bindValue(':id', $ID);
         $stmt->bindValue(':partner', $Partner);
         $stmt->bindValue(':merchant', $Merchant);
         $result = $stmt->execute() || die(var_dump($stmt->errorInfo()));
       }
      

      这里,$ID、$Partner 和 $Merchant 会自动转义,但您可能需要转义 $new_table 以避免 SQL 注入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        相关资源
        最近更新 更多