SQLSRV PHP удаление выбранной записи

В Интернете не так много руководств по Mssql с использованием драйвера sqlsrv, поэтому я следовал аналогичным учебникам с MySQL и, используя sqlsrv API, преобразовывал свой код. Пока все работает, могу добавлять записи с помощью всплывающей формы и т. Д.

Теперь я пытаюсь удалить несколько записей с помощью флажка. Я перепробовал все уроки, которые смог найти, но они все равно не работают.

Нет никакого эффекта после установки флажка и нажатия кнопки удаления, кроме вопроса из сценария onDelete, который спрашивает меня, хочу ли я удалять записи.

У меня есть два файла php - SQLTest.php и delete.php.

Код из SQLTest.php

<h1>SQL Testing</h1>
<h1>Component Group Modifications</h1>

<table class="table_general">
<tbody>

<tr>
  <th>ID</th>
  <th colspan="2">MODIFICATIONS</th>
  <th colspan="3">APPLICABLE WORKSHEET</th> 
  <th>Delete</th>
</tr>

<?php
$serverName = "THOMAS-PC\SQLEXPRESS";
$connectionInfo = array( "Database"=>"test");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) 
{
     echo "Connected to Database !";
}
else
{
     echo "Opps - something went wrong !";
     die( print_r( sqlsrv_errors(), true));
}

$tsql = "SELECT * FROM dbo.modIndex";
$query = sqlsrv_query($conn, $tsql);
if ($query === false){  exit("<pre>".print_r(sqlsrv_errors(), true));

}
while ($row = sqlsrv_fetch_array($query))
{  
?>
  <tr>
    <td><?php echo $row["recordID"];?></td>
    <td><?php echo $row["first"];?></td>
    <td><?php echo $row["second"];?></td>
    <td><?php echo $row["third"];?></td>
    <td><?php echo $row["fourth"];?></td>
    <td><?php echo $row["fifth"];?></td>
    <td><input type="checkbox" name="chkDel[]" value="<?php echo $row["recordID"];?>"></td>
  </tr>
<?php
}
sqlsrv_free_stmt($query);
?>

</tbody>
<input type="button" value="Delete Selected Records" action="delete.php" method="post" onclick="return onDelete();"/>
</table>

</section>
</section>

Код из delete.php

<?php

$serverName = "THOMAS-PC\SQLEXPRESS";
$connectionInfo = array( "Database"=>"test");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn === false )
{
     echo "<script>alert('Opps - something went wrong !');</script>";
     die( print_r( sqlsrv_errors(), true));
}
for($i = 0; $i < count($_POST["chkDel"]);$i++)
{
    if($_POST["chkDel"][$i] != "")

        {
            $tsql = "DELETE FROM dbo.modIndex ";
            $tsql = "WHERE recordID = '".$_POST["chkDel"][$i]."'  "; 
            $query = sqlsrv_query($conn, $tsql);
        }
}
    echo "Record Deleted.";

sqlsrv_free_stmt( $tsql);
sqlsrv_close( $conn);

?>

Короткая функция onDelate:

<script language="JavaScript">
    function onDelete()
    {
        if(confirm('Do you want to delete ?')==true)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
</script>

И мои детали SQL:

база данных -> тест -> таблица: dbo.modIndex recordID - первая - вторая - третья - четвертая - пятая

Спасибо заранее за вашу помощь.


person ThomasW    schedule 08.07.2015    source источник
comment
Вы уязвимы для атак с использованием SQL-инъекций. И вы не должны повторять удаленную запись, пока вы не ПОДТВЕРДИТЕ, что что-то действительно произошло. вы просто предполагаете, что ваш запрос на удаление выполнен успешно, что совершенно неверно.   -  person Marc B    schedule 09.07.2015
comment
Привет, Марк, спасибо за совет. Да, я исправлю этот код, но мне действительно нужно сначала решить мою проблему с удалением записей. Спасибо.   -  person ThomasW    schedule 09.07.2015
comment
относительно delete.php: а) вы проверили, что данные выглядят так, как вы ожидаете? например через var_export ($ _ POST) б) проверяли ли вы, что оператор for-loop / if-statement вводится хотя бы один раз? например распечатайте запрос перед его отправкой на sqlserver. c) нет обработки ошибок для возвращаемого значения sqlsrv_query (), см. msdn.microsoft.com/en-us/library/cc296200%28v=sql.105%29.aspx   -  person VolkerK    schedule 09.07.2015
comment
@VolkerK спасибо за совет. Я считаю, что правильно понимаю и добавил обработку ошибок в свой код, и теперь показывает мне ошибку, как показано ниже в моем недавнем сообщении.   -  person ThomasW    schedule 10.07.2015
comment
VolkerK - Я проверил переменные с помощью var_export ($ _ POST), но не уверен, чего ожидать.   -  person ThomasW    schedule 10.07.2015


Ответы (2)


Я меняю код, поскольку VolkerK предложил использовать метод POST и добавил обработку ошибок в delete.php, что дает мне больше информации.

Изменения ниже:

    <form name="frmMain" action="delete.php" method="post" OnSubmit="return onDelete();">

<table class="table_general">
<tbody>
<tr>
   <th>CustomerID</th>
    <th>Name</th>
    <th>Email</th>
    <th>CountryCode</th>
    <th>Budget</th>
    <th>Used</th>
    <th>Delete</th>
</tr>

<?php
$serverName = "THOMAS-PC\SQLEXPRESS";
$connectionInfo = array( "UID"=>"", "PWD"=>"", "Database"=>"test");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) 

{
     echo "Connected to Database !";
}
else
{
     echo "Opps - something went wrong !";
     die( print_r( sqlsrv_errors(), true));
}

$tsql = "SELECT * FROM dbo.customer";
$query = sqlsrv_query($conn, $tsql);
if ($query === false){  exit("<pre>".print_r(sqlsrv_errors(), true));

}
while ($objResult = sqlsrv_fetch_array($query))

{  

?>
  <tr>
    <td><?=$objResult["CustomerID"];?></td>
    <td><?=$objResult["Name"];?></td>
    <td><?=$objResult["Email"];?></td>
    <td><?=$objResult["CountryCode"];?></td>
    <td><?=$objResult["Budget"];?></td>
    <td><?=$objResult["Used"];?></td>
    <td><input type="checkbox" name="chkDel[]" value="<?=$objResult["CustomerID"];?>"></td>
  </tr>
<?php
}

sqlsrv_free_stmt($query);

?>
</tbody>

<input type="submit" name="btnDelete" value="Delete">
</table>
</form>

И delete.php дает мне ошибку после выбора одного флажка и нажатия кнопки удаления:

код delete.php:

    <?php

$serverName = "THOMAS-PC\SQLEXPRESS";
$connectionInfo = array( "Database"=>"test");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn === false )
{
     echo "<script>alert('Opps - something went wrong !');</script>";
     die( print_r( sqlsrv_errors(), true));
}
for($i = 0; $i < count($_POST["chkDel"]);$i++)
{
    if($_POST["chkDel"][$i] != "")

        {
            $tsql = "DELETE FROM dbo.customer";
            $strSQL .="WHERE CustomerID = '".$_POST["chkDel"][$i]."' ";
            $query = sqlsrv_query($conn, $tsql, $strSQL);
            var_export($_POST);

        }

        print_r(sqlsrv_errors());
        }


sqlsrv_free_stmt( $tsql);
sqlsrv_close( $conn);

?>

И ошибка выдается после установки флажка из трех доступных.

       Array
(
    [chkDel] => Array
        (
            [0] => 1
        )

    [btnDelete] => Delete
)
chkDel=Array<br />btnDelete=Delete<br />

Array
(
    [0] => Array
        (
            [0] => IMSSP
            [SQLSTATE] => IMSSP
            [1] => -14
            [code] => -14
            [2] => An invalid parameter was passed to sqlsrv_query.
            [message] => An invalid parameter was passed to sqlsrv_query.
        )

)

Детали моей базы данных:

база данных -> тест -> таблица: dbo.customer -> CustomerID - Имя - Электронная почта - CountryCode - Бюджет - Используется.

Я новичок в SQL PHP, и это сложнее, учитывая, что в Интернете не так много руководств по mssql и php.

Спасибо всем за помощь и советы.

person ThomasW    schedule 09.07.2015
comment
Вы не можете передать предложение WHERE в качестве параметра (ов) в sqlsrv_query (). Взгляните на примеры на docs.php.net/sqlsrv_query - person VolkerK; 10.07.2015
comment
Я трачу много времени, пытаясь создать форму редактирования, чтобы редактировать выбранную чекбоксом строку записей. Есть ли шанс преобразовать delete.php, чтобы разрешить редактирование выбранной строки записей. Я упомянул delete.php, поскольку считаю, что это будет аналогичный подход при редактировании. Я пытался это сделать, но у меня возникают проблемы с отображением выбранной записи для редактирования в отдельной форме. В этом случае я повторно использую свою форму insert.php. Любая помощь ? Спасибо, - person ThomasW; 15.07.2015

person    schedule
comment
VolkerK - Ты Мужчина! Спасибо за помощь. Я знал, что мне пришлось использовать prepare и exec, но у меня были проблемы с их объединением. Еще раз спасибо все отлично работает! - person ThomasW; 10.07.2015