Вставка в базу данных из php

#php #sql-server #sqlsrv

#php #sql-сервер #sqlsrv

Вопрос:

Я пытаюсь вставить данные в свою базу данных SQL Server из PHP. Я не получаю никаких ошибок, но данные не применяются к базе данных. Я пытался использовать тот же запрос, но преобразовал его в обычный запрос к базе данных, и это сработало, поэтому я предполагаю, что с моим кодом что-то не так:

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

Первый запрос проходит гладко. Второй не работает. У вас есть какие-нибудь идеи, что не так?

Комментарии:

1. Пожалуйста, укажите структуру ваших таблиц

Ответ №1:

Оригинальный ответ:

Вам нужно проверять наличие ошибок после каждого sqlsrv_query() вызова. Но более важной проблемой вашего подхода является то, что ваш код открыт для возможных атак с использованием SQL-инъекций. Всегда старайтесь использовать параметризованные запросы. Как упоминается в документации, функция 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;
}   
?>
 

Комментарии:

1. Спасибо за ответ, но он все еще не работает. Первый запрос отправляется в базу данных, а второй — нет. Без каких-либо ошибок.

2. @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 = ? ) не возвращает никаких строк.

3. Да, но почему? Тот же запрос в managment studio работает нормально.

4. Теперь я вижу, что с запросом что-то не так. Это не работает. Я постараюсь заставить это работать.

5. Работает как мечта. Большое вам спасибо, Жоров