mysql 根据等于列名的PHP变量更新列值

wz8daaqr  于 2023-08-02  发布在  Mysql
关注(0)|答案(3)|浏览(124)
$rating =  mysqli_real_escape_string($conn,$_POST['rating']);
$id = mysqli_real_escape_string($conn,$_POST['id']);
mysqli_query($conn,"UPDATE table SET $rating=$rating+1 WHERE id='$id'");

字符串
有什么方法可以更新基于PHP变量$rating的列吗?$rating是列名。
此外,这可能会带来安全风险等,所以我想知道这是否是一个很好的方法去做它。

lyr7nygr

lyr7nygr1#

是的,你可以在SQL中使用变量名作为字段名。但是,在将其放入sql字符串之前,必须首先验证它。因为它不是一个字段值,你不能“引用”它。

$rating =  $_POST['rating'];
// Define list of valid "rating" db field names here
$valid_fields = Array('rating_a', 'rating_b', 'rating_c');

if (in_array($rating, $valid_fields)) {
    $id = mysqli_real_escape_string($conn,$_POST['id']);
    mysqli_query($conn,"UPDATE table SET $rating=$rating+1 WHERE id='$id'");
}

字符串

nfzehxib

nfzehxib2#

使用PDO验证列变量对我不起作用。我尝试了'$colname+1'场景周围括号的各种排列,但它们都给出了错误。最后,我选择了SELECTING当前值,递增它并将其放回。

//  Find existing value:
    $query = "SELECT " . $col . " from " . $table . "
        WHERE bk_ref = :bk_ref";

    echo 'Select query is: ' . $query . ' with bk_ref: ' . $bk_ref . '<br />';

    $stmt = $pdo->prepare($query);
    $stmt->execute(['bk_ref' => $bk_ref]);

    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    echo 'Row is: '; print_r ($row); echo '<br />';
    $val = $row[$col];
    echo 'Found value: ' . $val . '<br />';
// Could use FETCH_NUM, $val would be at $row[0]

// Increment by 1 (or make any other changes required):    
    $val++;

//  Put it back into the table:
    $query1 = "UPDATE " . $table . " SET " . $col . " = " . $val . "
        WHERE bk_ref = :bk_ref";

    echo 'Update query is: ' . $query1 . ' with bk_ref: ' . $bk_ref . '<br />';

    $stmt = $pdo->prepare($query1);
    $stmt->execute(['bk_ref' => $bk_ref]);

字符串
我知道,这并不能准确地回答这个问题,可能会被视为“老派”,但它至少提供了一个合理简洁的解决方案,一旦“回声”和评论被删除。

ljo96ir5

ljo96ir53#

首先,你的sql是不正确的,因为我不认为变量可以是mysql中的列名。所以请在mysql数据库中检查你要更新的确切列。所以你的sql应该是这样的

$rating =  mysqli_real_escape_string($conn,$_POST['rating']) + 1;

$id = mysqli_real_escape_string($conn,$_POST['id']);
mysqli_query($conn,"UPDATE `table` SET `rating`=$rating WHERE id='$id'");

字符串
如果评级不是您的列名,则将其更改为确切的列名。希望我帮上忙了。

相关问题