从php插入数据库

从php插入数据库,php,sql-server,sqlsrv,Php,Sql Server,Sqlsrv,我正在尝试从PHP向SQL Server数据库插入数据。我没有得到任何错误,但数据并没有应用到数据库。我尝试使用相同的查询,但将其改为正常的数据库查询,结果成功了,因此我假设我的代码有问题: $query1 = " INSERT INTO KPI(KPI_new_name, KPI_definition, KPI_tech_name) VALUES('$KPI_new_name','$KPI_definition','$KPI_tech_name') "; $

我正在尝试从PHP向SQL Server数据库插入数据。我没有得到任何错误,但数据并没有应用到数据库。我尝试使用相同的查询,但将其改为正常的数据库查询,结果成功了,因此我假设我的代码有问题:

$query1 = "
   INSERT INTO KPI(KPI_new_name, KPI_definition, KPI_tech_name) 
   VALUES('$KPI_new_name','$KPI_definition','$KPI_tech_name')
";

$query2 = "
   INSERT INTO ReportsKpiRel(Report_Id, KPI_Id) 
   select r.Report_Id, kpis.KPI_Id 
   from Reports r 
   inner join ReportsKpiRel RKR on r.Report_Id = RKR.Report_Id
   inner join KPI kpis on RKR.KPI_Id = kpis.KPI_Id
   where r.Report_Id = '".$repid."' and kpis.KPI_new_name = '".$KPI_new_name."'
";

$qresult = sqlsrv_query($conn, $query1); 
if ($qresult)
{
  $qresult2 = sqlsrv_query($conn, $query2); 
  if($qresult2)
  {
    echo "Success!";
  }
  else
    echo "Failed!";
}
else
echo "error!";

第一个查询进行得很顺利。第二个是不起作用。你知道怎么回事吗?

原始答案:

您需要在每次调用
sqlsrv\u query()
后检查错误。但是,您的方法中更重要的问题是,您的代码可能会受到SQL注入攻击。始终尝试使用参数化查询。如中所述,sqlsrv_查询函数非常适合于一次性查询,并且应该是执行查询的默认选择,除非特殊情况适用,并且sqlsrv_查询函数同时执行语句准备和语句执行,并且可以用于执行参数化查询

以下代码基于问题中的代码,是您问题的可能解决方案:

<?php
$query1 = "
    INSERT INTO KPI(KPI_new_name, KPI_definition, KPI_tech_name) 
    VALUES(?, ?, ?)
";

$query2 = "
    INSERT INTO ReportsKpiRel(Report_Id, KPI_Id) 
    select r.Report_Id, kpis.KPI_Id 
    from Reports r 
    inner join ReportsKpiRel RKR on r.Report_Id = RKR.Report_Id
    inner join KPI kpis on RKR.KPI_Id = kpis.KPI_Id
    where r.Report_Id = ? and kpis.KPI_new_name = ? 
";

$params1 = array($KPI_new_name, $KPI_definition, $KPI_tech_name);
$result1 = sqlsrv_query($conn, $query1, $params1);
if ($result1 === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}   

$params2 = array($repid, $KPI_new_name);
$result2 = sqlsrv_query($conn, $query2, $params2);
if ($result2 === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}

echo "Success!";    
?>

谢谢你的回答,但它仍然不起作用。第一个查询进入数据库,但第二个查询不进入。没有任何错误。@maestrostas21那么,第二个
SELECT
语句(
SELECT r.Report\u Id,KPI.KPI\u Id from Reports r internal join Reports r.Report\u Id=RKR.Report\u Id inner join KPI on RKR.KPI\u Id=KPI.KPI\u Id,其中r.Report\u Id=?和KPI.KPI\u new\u name=?
)可能没有返回任何行。是的,但为什么?在ManagementStudio中使用相同的查询很好。现在我发现查询有问题。它不起作用了。我会努力让它工作的,就像做梦一样。非常感谢Zhorov,请提供您的表格结构
<?php
// INSERT into KPI
$query1 = "
    SET NOCOUNT ON;
    INSERT INTO KPI(KPI_new_name, KPI_definition, KPI_tech_name) 
    VALUES(?, ?, ?);
    SELECT SCOPE_IDENTITY() AS KPI_Id
";
$params1 = array($KPI_new_name, $KPI_definition, $KPI_tech_name);
$result1 = sqlsrv_query($conn, $query1, $params1);
if ($result1 === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}
$row = sqlsrv_fetch_array($result1, SQLSRV_FETCH_ASSOC);
$kpiid = $row['KPI_Id'];

// INSERT into ReportsKpiRel
$query2 = "
    INSERT INTO ReportsKpiRel(Report_Id, KPI_Id) 
    VALUES (?, ?) 
";
$params2 = array($repid, $kpiid);
$result2 = sqlsrv_query($conn, $query2, $params2);
if ($result2 === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}   
?>