Я хотел бы передать строку, содержащую пустые значения, а затем заполнить их функцией. (Я знаю 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);
Если это не просто пример, и вы действительно ищете что-то для выполнения SQL, вам определенно следует использовать подготовленный оператор вместо функции замены / интерполяции переменных.
почему бы не поместить строку запроса в функцию? почему бы не использовать pdo, похоже, вы делаете это сложнее, чем нужно
@MagnusEriksson Я просто хотел бы получить то, что я получаю, с помощью тестовой функции (вторая функция, которую я опубликовал, которая работает), но лучше (например, статус pdo)
@IdontDownVote, потому что у меня больше кнопок отправки, содержащих разные запросы
Извините, но я до сих пор не понимаю, какую проблему вы пытаетесь решить. Вы просто выводите некоторые значения в своей функции. Я не знаю, как это соотносится с любым "заявлением pdo"? Кроме того, «Я хотел бы передать строку, содержащую пустые значения» не имеет смысла. Строка - это строка. Это значение один (или пустая строка), а не несколько значений. Если вы хотите передать «пустое значение», зачем вообще что-либо передавать?
действительно ли переменные жестко запрограммированы в функции? так меняется только запрос? (обычно бывает наоборот)
@MagnusEriksson нет, у меня 1 строка вне функции ($ Query), содержащая 2 пустые переменные ($ variable1 и $ variable2)! Мне нужно правильно заполнить $ Query значениями, которые я создам в функции
@IdontDownVote У меня что-то вроде этого pastebin.com/cw3m4Ei8. После этого в функции я хотел бы заполнить соответствующие запросы $.
В вашем примере функция довольно бесполезна. Вам это не нужно в функции, так как вы просто устанавливаете $variable1 и $variable2 в функции. Вам действительно нужно сделать шаг назад, посмотреть на свой вопрос, а затем переписать его. До сих пор супер непонятно, чего ты хочешь. Фраза «строка с двумя пустыми переменными» вообще не имеет смысла.
@MagnusEriksson, пожалуйста, посмотрите еще раз на pastebin (я знаю, что submit3 на самом деле не работает)
Я не ухожу за пределы сайта, чтобы посмотреть код. Вы должны включить весь соответствующий код в сам вопрос.
@MagnusEriksson, это всего лишь пример! соответствующий пример - вторая опубликованная мною функция!






Предполагая, что $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, я редактирую ответ, чтобы показать способ сделать то, что, как я думаю, вы пытаетесь сделать с подготовленным заявлением.
где я могу увидеть этот новый путь?
@stackss Извините, я еще не закончил редактирование. Отметьте часть ответа в конце.
Он связывает значения, определенные в функции, с подготовленным оператором, заданным в качестве аргумента. Разве это не то, что вам нужно?
да, вы очень хорошо поняли, но, к сожалению, не работает!
Не могли бы вы подробнее рассказать, как это не работает? Я чувствую, что мы приближаемся к хорошему решению.
Я вижу. Дело в том, что подготовленные операторы работают не так. Вы не сможете увидеть строку SQL со связанными с ней значениями. Функция принимает оператор и связывает значения, и если вы вызовете $statement->execute() после foo($statement), оператор будет выполнен со значениями, которые вы связали в функции.
Возможно, вы правы, но если я поставлю $statement->execute(); после foo($statement);, я получу пустую страницу!
$statement->execute(); ничего не печатает, он выполняет инструкцию. Вы не сможете увидеть строку запроса со связанными значениями в ней. В этом суть параметризованных операторов - они отделяют SQL от значений. Доказательством того, что он работает правильно, будет то, что запрос был выполнен, в противном случае вы должны получить исключение PDOException.
вы можете использовать для этого 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 ().
@FedeCaceres Я не хочу помещать запрос внутрь функции!
@FedeCaceres Я повторяю: я не хочу помещать запрос внутрь функции! и я бы предпочел использовать PDO вместо mysqli
Я считаю, что вы пытаетесь этого добиться.
<?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());
}
}
?>
Но с переключателем в функции
Можете ли вы дать нам надлежащий пример того, что вы пытаетесь сделать? Код, который вы разместили, действительно не имеет смысла. Вы просто создаете локальные переменные в функции, с которой ничего не делаете, и ничего не возвращаете. На собственном примере мы сможем лучше понять.