【问题标题】:Inserting into database from php从php插入数据库
【发布时间】:2020-12-30 07:54:20
【问题描述】:

我正在尝试从 PHP 向我的 SQL Server 数据库中插入数据。我没有收到任何错误,但数据未应用于 db。我正在尝试使用相同的查询,但改成了普通的数据库查询并且它有效,所以我认为我的代码有问题:

$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!";

第一次查询顺利。二是不工作。你知道出了什么问题吗?

【问题讨论】:

  • 请提供您的表格结构

标签: php sql-server sqlsrv


【解决方案1】:

原答案:

您需要在每次sqlsrv_query() 调用后检查错误。但是,您的方法更重要的问题是您的代码对可能的 SQL 注入攻击是开放的。始终尝试使用参数化查询。正如documentation 中提到的,sqlsrv_query 函数非常适合一次性查询,除非有特殊情况,否则应该是执行查询的默认选择sqlsrv_query 函数同时执行这两种语句准备和语句执行,可用于执行参数化查询

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

<?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!";    
?>

更新:

看来你有不同的问题。因此,如果要处理many-to-many 关系并且KPI 表有标识列,则需要使用SCOPE_IDENTITY() 获取生成的值:

<?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;
}   
?>

【讨论】:

  • 感谢您的回答,但仍然无法正常工作。第一个查询进入数据库,但第二个不是。没有任何错误。
  • @maestrostas21 好吧,可能第二个 SELECT 语句 (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 = ? ) 不会返回任何行。
  • 是的,但是为什么呢?管理工作室中的相同查询工作正常。
  • 现在我发现查询有问题。它不工作。我会努力让它发挥作用。
  • 工作如梦。非常感谢佐罗夫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2017-06-21
  • 2013-09-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多