PHP Mysqli Query выполнить из таблицы данных запроса - PullRequest
2 голосов
/ 19 марта 2019

У меня есть SQL-запрос, который сохраняется в таблице.

tbl_query

SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = '$getBadgeID'

Тогда на PHP код:

$query = mysqli_query($con, "SELECT * FROM tbl_query");
while($data = mysqli_fetch_array($query))
{
    //SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = '$getBadgeID'
    $getQuery = $data['sql_query'];

    $qTotal = mysqli_query($con, $getQuery);
    $dTotal = mysqli_fetch_array($qTotal);

    echo $dTotal['TOTAL'];
}

Когда я пытался запустить этот код, он показывает, что итоговое значение равно 0. Но если я удаляю это WHERE badgeid_fk = '$getBadgeID' в данных запроса, результат будет ОК, а не 0.

Как сохранить выполнение запроса, даже если есть переменная '$getBadgeID'

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

Рекомендуется использовать подготовленные операторы для очистки запроса и защиты от внедрения SQL.Следующий комикс дает пример того, что такое SQL-инъекция.

enter image description here

Для ответа на вопрос мы обнаруживаем, что в вашем запросе была прочитана переменная $getBadgeIDкак текст, а не как переменная.Я рекомендую вам использовать этот код, который использует подготовленные операторы:

<?php
$conn = new mysqli("HOST", "USER", "SECRET", "DATABASE");
if($stmt = $conn->prepare("SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = ?")) {
    $stmt->bind_param("s", $getBadgeID);
    $stmt->execute(); 
    $result = $stmt->get_result();
    while($row = $result->fetch_assoc()) {
        $total = $row['TOTAL'];
    }
    $stmt->close();
}
$conn->close();
var_dump($total);

Если вы хотите больше отладки:

<?php
if(isset($getBadgeID) and $getBadgeID != ""){
    $conn = new mysqli("HOST", "USER", "SECRET", "DATABASE");
    if($stmt = $conn->prepare("SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = ?")) {
        $stmt->bind_param("s", $getBadgeID);
        $stmt->execute(); 
        $result = $stmt->get_result();
        while($row = $result->fetch_assoc()) {
            $total = $row['TOTAL'];
        }
        $stmt->close();
    }else{
        echo "Query is wrong";
    }
    $conn->close();
    var_dump($total);
}else{
    echo 'Variable $getBadgeID is empty';
}
3 голосов
/ 19 марта 2019

PHP обрабатывает эту переменную как строку, поэтому в результате генерируется этот запрос

SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = '$getBadgeID' // its not converting your variable with 150502

Здесь вы можете использовать альтернативное имя или разделитель, например:

Ваш текущий запрос:

SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = '$getBadgeID'

Измените ваш запрос с помощью:

SELECT SUM(simpanan_wajib) AS TOTAL FROM tb_simpanan WHERE badgeid_fk = ':getBadgeID'

Теперь вам нужно использовать str_replace для замены разделителя вашей переменной, например:

while($data = mysqli_fetch_array($query))
{
    $getQuery = str_replace(":getBadgeID", $getBadgeID , $data['sql_query']);    
}

Почему я здесь использую разделитель, потому что ваша переменная $ getBadgeID имеет определенное значение внутри вашего php-скрипта и не является динамической.

В нашем чате @executable предлагает другое решение для использования подготовленного утверждения.

Edit:

В соответствии с обсуждением с @Bananaapple, я добавляю этот комментарий для будущих посетителей, Prepared Statement - это еще одно решение, которое является более безопасным, если вы хотите избежать внедрения SQL, тогда выберите готовый оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...