是否可以参数化具有连接变量的查询?

Posted

技术标签:

【中文标题】是否可以参数化具有连接变量的查询?【英文标题】:Is it possible to parametarize query that has a concatenation variable? 【发布时间】:2019-05-10 10:08:18 【问题描述】:

在学习 php 和 sql 注入时,我想将我的查询参数化以实现安全可靠的网站应用程序。但是,我的不起作用我尝试参数化我的更新并选择我的查询,但我没有实现使程序正常工作的目标。

当前输出抛出错误? is not found

到目前为止,这是我的代码,我是否遗漏了一些不起作用的东西?

<?php  
//connection
$connection = mysqli_connect("hostserver","username","");
$db = mysqli_select_db($connection, 'dbname');

if (isset($_POST['qrname'])) 
    $qrid = $_POST['qrid'];

    //Query No. 1
    $qrQuery = "SELECT * FROM scratch_cards WHERE code='$qrid' ";
    $qrQuery_run = mysqli_query($connection,$qrQuery);

    //Query No. 2
    $qrQuery2 = "UPDATE scratch_cards SET status = 'U' WHERE code='$qrid' ";
    $qrQuery_run2 = mysqli_query($connection,$qrQuery2);
    $qrQuery2->bind_param("s", $qrid);
    $qrQuery2->execute();

    while ($qrRow = mysqli_fetch_array($qrQuery_run)) 
        $txtQrvalue = $qrRow['amount'];
        $txtQrstatus = $qrRow['status'];

        // QUERY TO UPDATE THE VALUE
        // BIND AND PARAMETIZE MY QUERY
        $qrQuery3 = $db->parepare("UPDATE shopusers SET ewallet = ewallet + " . (0+?) . " WHERE id = '?' ");
        $qrQuery3->bind_param("ii", $txtQrvalue, $id);
        $qrQuery3->execute(); 
        //END
    

【问题讨论】:

您不能引用占位符。查询应该是UPDATE shopusers SET ewallet = ewallet + ? WHERE id = ? @Qirel ,查询 1 和 2 怎么样?相同的绑定/?? @Qirel ,另一个问题,我需要绑定while循环吗?谢谢 你不需要绑定像SET status = 'U'这样的静态值。但绝对是 ID,因为它们是变量。使用SELECT,您还需要绑定结果。 @Qirel,页面无法加载:( 【参考方案1】:

如果我正确阅读了您的问题和代码,您可以使用JOIN 将其减少到两个查询,这样您就可以摆脱SELECT 语句。对两者都使用准备好的语句。

我还将连接的字符集指定为 UTF-8(您应该为 PHP 和 html 标头以及数据库表设置该字符集)。

<?php 
$connection = mysqli_connect("hostserver","username","");
$db = mysqli_select_db($connection, 'dbname');
$connection->set_charset("utf8");

if (isset($_POST['qrname'])) 
    $qrid = $_POST['qrid'];

    $sql = "UPDATE scratch_cards SET status = 'U' WHERE code=?";
    $stmt = $connection->prepare($sql);
    $stmt->bind_param("s", $qrid);
    $stmt->execute();
    $stmt->close();

    $sql = "UPDATE shopusers su
               INNER JOIN scratch_cards sc
                 ON sc.qrid = su.code
               SET su.ewallet = su.ewallet + sc.amount,
                   sc.status = 'U'
               WHERE sc.code = ?";
    $stmt = $connection->prepare($sql);
    $stmt->bind_param("s", $qrid);
    $stmt->execute();
    $stmt->close();

【讨论】:

能否请您包含while 循环?这很重要,谢谢 使用JOINs 的查询不需要它。请参阅第二个查询是使用 UPDATEJOIN。您可能有不同的ON 子句,我不太确定您的数据库结构。这是一般的想法。 它们是表的别名。意味着我们不必每次都输入shopusers,我们可以直接输入su 我对@9​​87654331@ 语句不是很熟悉.. 请问我是要广告UPDATE shopusers AS su 还是.. su 就像一个变量? 因为更新查询的语法有不同的颜色..所以它可能是一个错误的语法?【参考方案2】:

我们在 PDO 绑定参数中有 foll 语法,我将您的更新查询作为示例,它工作得非常好。 尝试搜索命名参数绑定

<?php


$user = 'root';
$pass = 'xxxx';
$DB = 'test';
$host = 'localhost';

$mysqlConnection = new \PDO('mysql:host='.$host.';dbname='.$DB, $user, $pass);
$mysqlConnection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$sql = 'update info set fname = fname + :fn where id = 1';

$stmt = $mysqlConnection->prepare($sql);
$stmt->bindValue(':fn', '100');
$stmt->execute();
echo $stmt->rowCount();


?>

【讨论】:

【参考方案3】:

这是您想使用 mysqli 绑定参数运行的查询吗???

<?php

ini_set('display_errors', 1);
$user = 'root';
$pass = 'xxxx';
$DB = 'test';
$host = 'localhost';

$sql = 'update info set fname =  fname + ? where id = 1';

$conn = new mysqli($host, $user, $pass, $DB);
$stmt = $conn->prepare($sql);

$stmt->bind_param("i", $val);
$val = 100;
$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);
exit;

【讨论】:

以上是关于是否可以参数化具有连接变量的查询?的主要内容,如果未能解决你的问题,请参考以下文章

Postman入门-参数化

为什么参数化查询可以防止SQL注入?(转)

sqlsugar可以参数化查询吗

是否可以在 sqlkata 中查询参数化的表值函数?

Postman参数化

什么是参数化查询?