-3

下面的代码是它的一个小版本。

我的 MySQL 表“报告”如下所示:

报告

rep_id rep_description rep_query
varchar 3 varchar 50 varchar 50
-------------------------------------------------- --------------------------
| R01 | 姓名搜索 | SELECT name FROM customers WHERE name='$var' |
-------------------------------------------------- --------------------------
| R02 | 所有名字 | 从客户中选择姓名 |
-------------------------------------------------- --------------------------

一个report_list.php 生成可用报告的列表。如果报告有一个“搜索字段”,它被放置在一个 html 表单中。对于 R01,我们将拥有:

<h3>R01</h3>`
<form action="generator.php" method=post>
<input type="text" name="var" >Search String
<input type="hidden" name="rep" value='R01'>
<input type="submit"></form>

这是“generator.php”。请记住,所有 MySQL 注入和代码保护都已放置。问题的核心只是字符串扩展

<?php
$var=$_REQUEST['var'];
$rep=$_REQUEST['rep'];

mysql_connect(******,*****,******,false,65536);
@mysql_select_db(*******) or die("Unable to select database");

$query="SELECT rep_query FROM reports WHERE rep_id='$rep'";
$result=mysql_query($query);
$runsql=mysql_result($result,0,'rep_query');

//Now run the query you just got from querying the MySQL

$runthatquery=mysql_query($runsql);
// Here it should run "SELECT name FROM customers  WHERE name='$var'"
.
.
// I removed the code that print the query results
?>

问题是 $runsql 会从 R02运行“SELECT name FROM customers”。它不会运行"SELECT name FROM customers WHERE name='$var'" - 因为 $var 没有扩展。

我知道一旦从 MySQL 中检索到字符串,可以使用带有 substr、replace(等等)的函数来更改字符串。我不想这样做,因为我的现实生活中的代码有很多变量。

我试过 eval 和 parse_str (只是为了尝试)但没有成功。

因此,我的问题是:是否有命令将此字符串转换为适当扩展变量的字符串?

4

1 回答 1

3

您对 PHP 的工作原理有一个基本的误解,将原始 PHP 变量名存储在数据库记录中是错误的方法。如果您必须存储这样的查询,则存储适当的准备语句样式查询,例如

SELECT name WHERE name = :name

然后使用适当的数据库接口库,如 mysqli 或 PDO 来填充这些占位符。

于 2013-10-01T19:33:40.370 回答