在PDO更新语句中使用变量

时间:2014-04-10 19:41:26

标签: php mysql pdo

感谢所有提供意见的人。是的,我是pdo和php编程的新手,所以你们在我的代码中可能很容易发现的一些基本错误对我来说并不那么明显。

我认为我的解释不是那么清楚,所以我要再试一次。

$ newCoins不是我表中的一个字段,它只是一个临时变量,存储了我需要添加到gold字段的一些数字。我不认为我需要绑定它。

$ coinType不是字段,而是包含字段名称的变量。它可以是任何银,青铜等等,但在我们的例子中,我们可以假设它的黄金。

黄金是我桌上的一块田地。 我的桌子上有6个字段。另一个脚本会进行一些计算以确定要选择的字段。在这种情况下,我们假设选择黄金然后分配给$ coinType 我在select语句中使用$ coinType来获取gold字段中的值。

问题是,在我获得存储在黄金领域中的值并在数学计算中使用它之后,我不确定如何将新值返回到黄金领域。 示例$ coinType被赋予字符串“gold”,用于引用黄金字段。

$ newCoins有一个值,我希望将它添加到黄金领域,但是当我将$ newCoin分配给$ coinType时,字符串“gold”将被覆盖,意味着对黄金领域的引用将丢失。

这是我的语法。我希望我现在有点清楚。   我正在尝试将$ newCoins的值分配给字段“gold”。 gold是表示字段名称的字符串。 Gold是存储在$ coinType中的字符串。

$ usr_check = $ connDB-> prepare(“UPDATE coins SET $coinType ='$ newCoins'  在哪里'$ coinType'='$ coinType“); $ usr_check-> bindParam(':coinType',$ coinType,PDO :: PARAM_INT);

提前感谢您的光临。

<?php

$owner_id        = "Robert"; // the user id
$coinType        = "gold"; //this is the field that was randomly selected for update
$additionalCoins = 289; //add this number to whatever value already stored in gold field.

$usr_check = $connDB->prepare("SELECT 1 FROM coins WHERE owner_id = :owner_id");
$usr_check->bindParam(':owner_id', $owner_id, PDO::PARAM_STR);
$usr_check->execute();

if ($usr_check->rowCount() > 0) {

    $usr_check = $connDB->prepare("SELECT * FROM coins WHERE '$coinType' = '$coinType'");
    $usr_check->bindParam(':coinType', $coinType, PDO::PARAM_INT);
    $usr_check->execute();
    # setting the fetch mode
    $usr_check->setFetchMode(PDO::FETCH_ASSOC);
    $row          = $usr_check->fetch();
    $discounted_p = $row["$coinType"];
    $newCoins     = $discounted_p + $additionalCoins;

    $usr_check = $connDB->prepare("UPDATE coins SET '$coinType'='$newCoins' WHERE owner_id = :owner_id");
    $usr_check->bindParam(':$coinType', $coinType, PDO::PARAM_INT);
    $usr_check->bindParam(':owner_id', $owner_id, PDO::PARAM_STR);
    $usr_check->execute();
}

3 个答案:

答案 0 :(得分:-1)

你做错了一件事是你绑定$ coinType,这是列名。你需要绑定$ newCoins。

试试这个语法:

$usr_check = $connDB->prepare("SELECT * FROM coins WHERE `$coinType` = :coinType");
    $usr_check->bindParam(':coinType', $coinType, PDO::PARAM_INT);

$usr_check = $connDB->prepare("UPDATE coins SET `$coinType`=:newCoins 
 WHERE owner_id = :owner_id");
$usr_check->bindParam(':coinType', $coinType, PDO::PARAM_INT);

答案 1 :(得分:-1)

$owner_id        = "Robert";
$coinType        = "gold";
$additionalCoins = 289;

$allowed = ['gold','silver'];
if (in_array($coinType, $allowed))
{
    $sql = "UPDATE coins SET `$coinType` = `$coinType` + ? WHERE owner_id = ?";
    $stmt = $connDB->prepare($sql);
    $usr_check->execute([$additionalCoins, $owner_id]);
}

错误,注射和重复认证证明

答案 2 :(得分:-1)

我认为你误解了PDO变量名(占位符)。您准备一个变量名称前面带冒号的语句,如下所示:

$connDB->prepare("SELECT * FROM coins WHERE type = :coinType")

使用bindParam传递参数使用此变量并将php变量的值赋给它。

$usr_check->bindParam(':coinType', $coinType);

这使得将潜在不安全的php变量直接传递给sql语句是不必要的。

请参阅PDOStatement::bindParam