Php 在同一查询中使用insert和select

Php 在同一查询中使用insert和select,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我想插入两个值,第一个是变量,第二个是select语句,但上面的代码不起作用…当使用插入select时,您不需要使用值。删除该变量,然后将$new\u id变量移动到select语句中: $new_id = mysqli_insert_id($dbc) foreach ($_POST['d_specialty'] as $key => $value) { $q = "INSERT INTO d_specialty (d_id, s_id) VALUES ($new_id

我想插入两个值,第一个是变量,第二个是select语句,但上面的代码不起作用…

当使用
插入select时,您不需要使用
值。删除该变量,然后将
$new\u id
变量移动到
select
语句中:

$new_id = mysqli_insert_id($dbc)    
foreach ($_POST['d_specialty'] as $key => $value) {
      $q = "INSERT INTO d_specialty (d_id, s_id) VALUES ($new_id, (SELECT specialty.id FROM specialty WHERE specialty.name = $value))";
      $r = mysqli_query($dbc,$q);

首先,使用
insert。选择

INSERT INTO d_specialty (d_id, s_id) 
SELECT $new_id, specialty.id 
FROM specialty 
WHERE specialty.name = $value

其次,参数化查询,以便将
$new\u id
$value
作为参数传入,而不是直接放入查询字符串中。一个原因是为了防止SQL注入攻击。另一个非常重要的原因是要防止潜在的语法错误。

您的意思是创建查询函数并将变量作为参数调用它?这些变量不是已经参数化了吗@sgeddes@OmarAlhadidy--参数化查询并不意味着使用
函数
并传递它们。。。话虽如此,我并不经常使用
php
,所以我不确定。改为使用
看起来不错:谢谢,我会再搜索一点并在@sgedest之后更正它们。原因可能是子查询返回的行数超过1行。警告:使用
mysqli
时,您应该使用并将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
$\u POST
$\u GET
数据直接放入查询,如果有人试图利用您的错误,这可能非常有害。
INSERT INTO d_specialty (d_id, s_id)
    SELECT $new_id, specialty.id
    FROM specialty
    WHERE specialty.name = $value;