Php 如何使用SQL查询中的查询进行查询

Php 如何使用SQL查询中的查询进行查询,php,mysql,Php,Mysql,好吧,这么复杂的标题,让我解释一下 我正在尝试将SQL查询插入我的SQL数据库,例如 插入示例数据库(查询)值('SELECT*FROM users,其中id={$userID}') 稍后,我将从另一个PHP文件执行以下操作: mysqli_query($queryfromabove); 问题是PHP变量没有被传递。(它存在于我称之为的文件中)我知道这是非常非正统的,可能不推荐,但有没有人知道这样做的方法 根据要求,以下是实际代码: $sql="INSERT INTO awards(nam

好吧,这么复杂的标题,让我解释一下

我正在尝试将SQL查询插入我的SQL数据库,例如

插入示例数据库(查询)值('SELECT*FROM users,其中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变量是$\u POST['query'],因为它包含:

SELECT * FROM crts WHERE id='$crtid'
然后,从另一个文件中(请原谅变量名过于草率,这是一个WIP):

$that=mysqli\u fetch\u assoc(mysqli\u查询($conn,“SELECT*FROM awards,其中id=2”);
回显$that['query']。
; $crtid=$\会话['crt']['id']; $query=$that['query']; $thisquery=mysqli\u查询($conn$query); $finally=mysqli\u fetch\u assoc($thisquery); 打印(最终);

ID2是我在所有帖子中插入的sql结果的ID。

使用准备好的语句。将以下内容放入数据库:

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);
如果需要能够替换任意变量,可以使用相应全局变量的值替换字符串中的所有
{$variable}

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

允许存储SQL查询字符串会使数据库遭受恶意攻击。请考虑使用存储过程——这是MySQL的一个例子。p> 那个查询是单引号的吗<代码>$queryfromabove='query'否,据我所知,查询不是。实际上,非常具体地说,我将从$u POST变量中获取第一个查询。编辑:哦,你是指$queryfromabove变量。不,当我回显那个变量时,我看不到任何引号。不要这样做。从用户可以任意更改的变量中获取查询是一个严重的安全问题。假设他们发布了查询“DROP TABLE sample_db”。@Actorclavilis这纯粹是一个管理问题,用户无权访问它。@chris85当然,我马上发布它。这是一个非常好的主意,但是有没有办法在查询中指定变量的名称?在本例中,您必须在事件发生后分配变量名。我添加了一个解决方案,该解决方案使用
preg\u replace\u callback
将所有变量引用替换为它们的值。非常感谢您,您之前已经回答了我的一个问题,我完全相信您是一个PHP向导。这非常有效,但他希望查询能够获取PHP变量的值。MySQL存储过程如何做到这一点?谢谢你的提问,Barmar。由于查询是一个POST值,因此可以在客户端对其进行更改,从而造成安全风险,而不是直接从$\u SESSION['query']变量调用查询,作者应该调用对存储过程服务器端的引用,以便脏的'query'值不允许恶意的查询调用。$_SESSION['query']的值应该调用一个PHP函数,可能是通过一个开关来收集PHP变量并填充任何存储过程参数。他在一篇评论中说,这是一个管理过程,因此提交表单的用户应该是可信的。他们可能可以直接执行SQL查询,因此允许他们将查询插入数据库不会产生任何额外的安全风险。这很公平,尽管人们永远不知道将来是否会发生变化。依我拙见,最好第一次就把它做好。
$sql = preg_replace('/\{\$(\w+)\}/', function($matches) use ($conn) {
    return mysqli_real_escape_string($conn, $GLOBALS[$matches[1]]);
}, $queryfromabove);
mysqli_query($conn, $sql);