Как передать пустые переменные в функцию и изменить их значения

Я хотел бы передать строку, содержащую пустые значения, а затем заполнить их функцией. (Я знаю SQL-инъекцию). С другой стороны, я хотел бы иметь хороший пример с оператором pdo

function foo(&$var) {
    $variable1 = "test";
    $variable2 = "test";
    echo $var;
}
$string = "UPDATE table SET column1=$variable1 WHERE column2=$variable2";
foo($string);

Я также знаю другой способ добиться этого. Но это не лучший способ

function test($Query) {
        $variable1 = "test";
        $variable2 = "test";

        $finalQuery = vsprintf($Query, array($variable1, $variable2));
        print_r($finalQuery);
    }
$Query = "UPDATE table SET column1='%s' WHERE column2='%s'";
test($Query);

Можете ли вы дать нам надлежащий пример того, что вы пытаетесь сделать? Код, который вы разместили, действительно не имеет смысла. Вы просто создаете локальные переменные в функции, с которой ничего не делаете, и ничего не возвращаете. На собственном примере мы сможем лучше понять.

Magnus Eriksson 29.08.2018 00:49

Если это не просто пример, и вы действительно ищете что-то для выполнения SQL, вам определенно следует использовать подготовленный оператор вместо функции замены / интерполяции переменных.

Don't Panic 29.08.2018 00:49

почему бы не поместить строку запроса в функцию? почему бы не использовать pdo, похоже, вы делаете это сложнее, чем нужно

user10226920 29.08.2018 00:50

@MagnusEriksson Я просто хотел бы получить то, что я получаю, с помощью тестовой функции (вторая функция, которую я опубликовал, которая работает), но лучше (например, статус pdo)

stackss 29.08.2018 00:53

@IdontDownVote, потому что у меня больше кнопок отправки, содержащих разные запросы

stackss 29.08.2018 00:54

Извините, но я до сих пор не понимаю, какую проблему вы пытаетесь решить. Вы просто выводите некоторые значения в своей функции. Я не знаю, как это соотносится с любым "заявлением pdo"? Кроме того, «Я хотел бы передать строку, содержащую пустые значения» не имеет смысла. Строка - это строка. Это значение один (или пустая строка), а не несколько значений. Если вы хотите передать «пустое значение», зачем вообще что-либо передавать?

Magnus Eriksson 29.08.2018 00:55

действительно ли переменные жестко запрограммированы в функции? так меняется только запрос? (обычно бывает наоборот)

user10226920 29.08.2018 00:56

@MagnusEriksson нет, у меня 1 строка вне функции ($ Query), содержащая 2 пустые переменные ($ variable1 и $ variable2)! Мне нужно правильно заполнить $ Query значениями, которые я создам в функции

stackss 29.08.2018 00:59

@IdontDownVote У меня что-то вроде этого pastebin.com/cw3m4Ei8. После этого в функции я хотел бы заполнить соответствующие запросы $.

stackss 29.08.2018 01:02

В вашем примере функция довольно бесполезна. Вам это не нужно в функции, так как вы просто устанавливаете $variable1 и $variable2 в функции. Вам действительно нужно сделать шаг назад, посмотреть на свой вопрос, а затем переписать его. До сих пор супер непонятно, чего ты хочешь. Фраза «строка с двумя пустыми переменными» вообще не имеет смысла.

Magnus Eriksson 29.08.2018 01:02

@MagnusEriksson, пожалуйста, посмотрите еще раз на pastebin (я знаю, что submit3 на самом деле не работает)

stackss 29.08.2018 01:06

Я не ухожу за пределы сайта, чтобы посмотреть код. Вы должны включить весь соответствующий код в сам вопрос.

Magnus Eriksson 29.08.2018 01:06

@MagnusEriksson, это всего лишь пример! соответствующий пример - вторая опубликованная мною функция!

stackss 29.08.2018 01:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
13
87
3

Ответы 3

Предполагая, что $variable1 и $variable2 не определены буквально, как показано в вашем примере (я предполагаю это из вашего комментария «Мне нужно правильно заполнить $ Query значениями, которые я создам в функции»), я бы сказал, что ваша функция нуждается в взять подготовленный оператор вместо строки.

function foo(PDOStatement $statement) {
    // stuff happens that creates $variable1 and $variable2
    $statement->bindValue(1, $variable1);
    $statement->bindValue(2, $variable2);
    return $statement;
}

И вместо определения $string создайте подготовленный оператор и передайте его функции.

$statement = $pdo->prepare('UPDATE table SET column1=? WHERE column2=?');
foo($statement);

Что касается того, как вы пытаетесь сделать это в первом блоке кода в своем вопросе, есть несколько проблем.

Единственный способ передать строку с предопределенными переменными в ней, а затем заполнить их в функции - сначала определить строку с помощью одинарных кавычек. В противном случае, используя двойные кавычки, PHP будет искать $variable1 и $variable2 в глобальной области видимости, а не находить их, и их неопределенные (нулевые) значения будут заменены пустыми строками в $string, прежде чем вы сможете перейти к функции.

$string='UPDATE table SET column1=$variable1 WHERE column2=$variable2';

Затем в функции единственный известный мне способ получить интерполированные предопределенные переменные - это передать эту строку в eval.

function foo(&$var) {
    $variable1 = "test";
    $variable2 = "test";
    eval('$var = "' . $var . '";');
    echo $var;
}

Теперь это работает для этого примера, но это ужасная идея.

  • Когда вы пишете такую ​​строку, вы зависите от определенных переменных, определенных внутри функции, а ваша функция зависит от ее ввода, имеющего эти переменные. Вы никогда не сможете изменить эту функцию.

  • Это зависит от eval. Использование eval опасно; он позволяет выполнять любую строку в вашей системе как код PHP, и вы, вероятно, не сможете безопасно ограничить источник этой строки.

  • Если это будет использоваться для выполнения SQL, это не лучший способ сделать это, независимо от того, является ли это хорошим способом построения строк в целом, а я уже сказал, что это не так. Вы должны привязать значения к подготовленному оператору.

Другой способ - использовать VSPRINTF, как я писал ранее, во второй функции, которую я назвал «test». Я тоже знаю eval, но как вы говорите, это ужасная идея!

stackss 29.08.2018 01:12

Привет @stackss, я редактирую ответ, чтобы показать способ сделать то, что, как я думаю, вы пытаетесь сделать с подготовленным заявлением.

Don't Panic 29.08.2018 01:13

где я могу увидеть этот новый путь?

stackss 29.08.2018 01:16

@stackss Извините, я еще не закончил редактирование. Отметьте часть ответа в конце.

Don't Panic 29.08.2018 01:18

Он связывает значения, определенные в функции, с подготовленным оператором, заданным в качестве аргумента. Разве это не то, что вам нужно?

Don't Panic 29.08.2018 01:28

да, вы очень хорошо поняли, но, к сожалению, не работает!

stackss 29.08.2018 01:30

Не могли бы вы подробнее рассказать, как это не работает? Я чувствую, что мы приближаемся к хорошему решению.

Don't Panic 29.08.2018 01:32

Я вижу. Дело в том, что подготовленные операторы работают не так. Вы не сможете увидеть строку SQL со связанными с ней значениями. Функция принимает оператор и связывает значения, и если вы вызовете $statement->execute() после foo($statement), оператор будет выполнен со значениями, которые вы связали в функции.

Don't Panic 29.08.2018 01:39

Возможно, вы правы, но если я поставлю $statement->execute(); после foo($statement);, я получу пустую страницу!

stackss 29.08.2018 01:44
$statement->execute(); ничего не печатает, он выполняет инструкцию. Вы не сможете увидеть строку запроса со связанными значениями в ней. В этом суть параметризованных операторов - они отделяют SQL от значений. Доказательством того, что он работает правильно, будет то, что запрос был выполнен, в противном случае вы должны получить исключение PDOException.
Don't Panic 29.08.2018 01:47

вы можете использовать для этого mysqli:

class Database {
  protected $con;
  public __construct(){
    $this->con=mysqli_connect("my_host","my_user","my_password","my_db");
    if (mysqli_connect_errno()) {   echo "Failed to connect to MySQL: " . mysqli_connect_error(); }
  }

  public __destruct(){
    mysqli_close($this->con);
  }

  public query($sql){
    if (!mysqli_query($this->con,$sql)) {   die('Error: ' . mysqli_error($this->con)); };
  }

}

class Table extends Database {
  public function update($var, $var2){
    $var = mysqli_real_escape_string($con,$var);
    $var2 = mysqli_real_escape_string($con,$var2);
    $sql = "UPDATE table SET column1=$var1 WHERE column2=$var2";
    $this->query($sql);
  }
}

Таким образом, вы можете использовать php mysqli_real_escape_string, который поможет вам предотвратить SQL-инъекцию.

Также вы можете выбрать вариант с подготовленными выписками. Просто измените метод обновления для:

public function update($var, $var2){
        $smtp = mysqli_prepare($this->con,"UPDATE table SET column1=? WHERE column2=?");
        mysqli_stmt_bind_param($smtp,'ss', $var,$var2);
        mysqli_stmt_execute($stmt);
}

Я бы предпочел использовать подготовленные операторы вместо mysql_escape_string ().

Magnus Eriksson 29.08.2018 01:05

@FedeCaceres Я не хочу помещать запрос внутрь функции!

stackss 29.08.2018 01:08

@FedeCaceres Я повторяю: я не хочу помещать запрос внутрь функции! и я бы предпочел использовать PDO вместо mysqli

stackss 29.08.2018 01:19

Я считаю, что вы пытаетесь этого добиться.

<?php
/* On update l'historique côté vets; ici on controle et on dit KESSKONFAI*/
    include('../Models/db_connect.php');
    $a = explode('-',$_GET['a']);
    $o = $_GET['o'];

    switch($a):
        case($a[1] === 'breed'):
                if ($a[0] === 'desc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY breed DESC";
                } else if ($a[0] === 'asc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY breed ASC";
                }
            break;
        case($a[1] === 'name'):
                if ($a[0] === 'desc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY pet_name DESC";
                } else if ($a[0] === 'asc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY pet_name ASC";
                }
            break;
        case($a[1] === 'color'):
                if ($a[0] === 'desc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY colour DESC";
                } else if ($a[0] === 'asc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY colour ASC";
                }
            break;
        case($a[1] === 'sex'):
                if ($a[0] === 'desc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY sex DESC";
                } else if ($a[0] === 'asc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY sex ASC";
                }
                break;
        case($a[1] === 'date'):
                if ($a[0] === 'desc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY date_of_birth DESC";
                } else if ($a[0] === 'asc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY date_of_birth ASC";
                }
            break;
        case($a[1] === 'chip'):
                if ($a[0] === 'desc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY microchip_tatoo DESC";
                } else if ($a[0] === 'asc'){
                    $query = 
                    "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                    FROM patients
                    WHERE
                    owner_ID = :ID
                    ORDER BY microchip_tatoo ASC";
                }
            break;
        case($a[1] === 'hist'):
            if ($a[0] === 'desc'){
                $query = 
                "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                FROM patients
                WHERE
                owner_ID = :ID
                ORDER BY history DESC";
            } else if ($a[0] === 'asc'){
                $query = 
                "SELECT pet_name, ID, breed, colour, sex, date_of_birth,microchip_tatoo, history
                FROM patients
                WHERE
                owner_ID = :ID
                ORDER BY history ASC";
            }
            break;
        default:
    endswitch;

    if (isset($query)){
        include('../Models/order_by_clients.php');
        $patients_rows = order_by($query,$o,$db);
    }
?>

Функция:

<?php
    function order_by($query,$o,&$db){

        $query_params = array(':ID' => $o);

            try {
                $stmt = $db->prepare($query);
                $result = $stmt->execute($query_params);
                $patients_rows = $stmt -> fetchAll();
                for($i = 0;$i < count($patients_rows);$i++){
                    $patients_rows[$i]['history'] = "\n".strtr($patients_rows[$i]['history'],array("."=>".\r\r","\S:"=>" :\r","-"=>" - "));
                }
                include '../Views/order_by_clients.php';

            }catch(PDOException $ex){
                die("Failed to run query: " . $ex->getMessage());
            }
    }
?>

Но с переключателем в функции

Другие вопросы по теме