如何使用SQL查询中的查询进行查询
好吧,真的很复杂的标题,让我解释一下。如何使用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。
使用准备好的语句。把下面的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);
一个神话般的主意! – AbraCadaver
这是一个非常好的主意,但有什么方法可以在查询中指定变量的名称吗?在这个例子中,你必须在事实之后分配变量名。 – Newah
我补充说,使用'preg_replace_callback'与他们的价值观,以取代所有的变量引用的解决方案。 – Barmar
允许存储SQL查询字符串将使数据库暴露于恶意攻击。请考虑使用存储过程 - 这是MySQL的一个例子。 http://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html
但他希望查询获取PHP变量的值。 MySQL存储过程如何做到这一点? – Barmar
谢谢你的问题,巴尔玛。由于查询是岗位价值,它是可以改变的客户端,这使得它的安全隐患,而不是直接从$ _SESSION [“查询”]变量调用查询,笔者应该调用存储过程服务器 - 参考这样一个肮脏的'查询'值不会允许恶意查询调用。的$ _SESSION [“查询”]的值应该调用PHP函数,可能通过一个开关,收集PHP变量和填充任何存储过程的参数。 –
他在评论中说这是一个行政程序,所以提交表单的用户大概是可信的。他们可能直接执行SQL查询,因此允许他们将查询插入到数据库中不会产生额外的安全风险。 – Barmar
这是在单引号查询? '$ queryfromabove ='query';' – chris85
不,查询据我所知不是。其实非常具体,我从$ _POST变量中获得第一个查询。编辑:哦,你的意思是$ queryfromabove变量。不,当我回应这个变量时,我没有看到任何引号。 – Newah
不要这样做。从用户可以任意更改的变量中获取查询是一个严重的安全问题。想象一下,他们发布了查询“DROP TABLE sample_db”。 – Actorclavilis