2015-07-10 169 views
0

好吧,真的很复杂的标题,让我解释一下。如何使用SQL查询中的查询进行查询

我试图插入SQL查询到我的SQL数据库,例如

INSERT INTO sample_db(query) VALUES ('SELECT * FROM users WHERE id={$userID}')

再后来就从另一个PHP文件,我会做这样的事情:

mysqli_query($queryfromabove); 

的问题是PHP变量不被通过。 (它存在于我称之为的文件中)我知道这非常非正统,可能不推荐,但是有没有人知道这样做?

如这里要求的实际代码:

$sql="INSERT INTO awards(name,image,query,clm,type,number) VALUES ('".$_POST['name']."','".$_POST['image']."','".$_POST['query']."','".$_POST['column']."','".$_POST['condition']."','".$_POST['number']."')"; 
    mysqli_query($conn,$sql); 

我赞同所有的职位,并知道他们有正确的数据。最重要的POST变量这里,为$ _ POST [ '查询'],因为它包含:

SELECT * FROM crts WHERE id='$crtid' 

然后,从另一个文件(原谅马虎的变量名,这是一个WIP):

$that = mysqli_fetch_assoc(mysqli_query($conn,"SELECT * FROM awards WHERE id=2")); 
echo $that['query'].'<br>'; 
$crtid = $_SESSION['crt']['id']; 
$query = $that['query']; 
$thisquery = mysqli_query($conn,$query); 
$finally = mysqli_fetch_assoc($thisquery); 
print_r($finally); 

ID 2是我插入所有帖子的sql结果的ID。

+0

这是在单引号查询? '$ queryfromabove ='query';' – chris85

+0

不,查询据我所知不是。其实非常具体,我从$ _POST变量中获得第一个查询。编辑:哦,你的意思是$ queryfromabove变量。不,当我回应这个变量时,我没有看到任何引号。 – Newah

+0

不要这样做。从用户可以任意更改的变量中获取查询是一个严重的安全问题。想象一下,他们发布了查询“DROP TABLE sample_db”。 – Actorclavilis

回答

2

使用准备好的语句。把下面的DB:

INSERT INTO sample_db(query) VALUES ('SELECT * FROM users WHERE id=?') 

然后,当您要执行它,你先准备好它的参数变量绑定,并执行它。

$stmt = mysqli_prepare($conn, $queryfromabove); 
mysqli_stmt_bind_param($stmt, "s", $userID); 
mysqli_stmt_execute($stmt); 

如果您需要能够替代任何变量,你可以使用preg_replace_callback全部更换{$variable}与相应的全局变量的值的字符串中。

$sql = preg_replace('/\{\$(\w+)\}/', function($matches) use ($conn) { 
    return mysqli_real_escape_string($conn, $GLOBALS[$matches[1]]); 
}, $queryfromabove); 
mysqli_query($conn, $sql); 
+0

一个神话般的主意! – AbraCadaver

+0

这是一个非常好的主意,但有什么方法可以在查询中指定变量的名称吗?在这个例子中,你必须在事实之后分配变量名。 – Newah

+0

我补充说,使用'preg_replace_callback'与他们的价值观,以取代所有的变量引用的解决方案。 – Barmar

0

允许存储SQL查询字符串将使数据库暴露于恶意攻击。请考虑使用存储过程 - 这是MySQL的一个例子。 http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html

+0

但他希望查询获取PHP变量的值。 MySQL存储过程如何做到这一点? – Barmar

+0

谢谢你的问题,巴尔玛。由于查询是岗位价值,它是可以改变的客户端,这使得它的安全隐患,而不是直接从$ _SESSION [“查询”]变量调用查询,笔者应该调用存储过程服务器 - 参考这样一个肮脏的'查询'值不会允许恶意查询调用。的$ _SESSION [“查询”]的值应该调用PHP函数,可能通过一个开关,收集PHP变量和填充任何存储过程的参数。 –

+0

他在评论中说这是一个行政程序,所以提交表单的用户大概是可信的。他们可能直接执行SQL查询,因此允许他们将查询插入到数据库中不会产生额外的安全风险。 – Barmar