#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. Работает как мечта. Большое вам спасибо, Жоров