2015-07-08 4 views
0

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

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

После выбора флажка и нажатия удалить вопрос отдельно от скрипта 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); 

?> 

Short функция onDelate:

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

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

база данных -> test -> table: dbo.modIndex recordID - первая - вторая - третья - четвертая - пятая

Заранее благодарю вас за помощь.

+0

Вы уязвимы для [SQL-инъекций] (http://bobby-tables.com). И вы не должны повторять «запись удалена» до тех пор, пока вы НЕ ПОДТВЕРЖДАете, что что-то действительно произошло. вы просто считаете, что ваш запрос на удаление преуспел, что совсем не так. –

+0

Привет, Марк, благодарю вас за совет.Да, я пересмотрю этот код, но мне действительно нужно решить мою проблему с удалением записей. Спасибо. – ThomasW

+0

относительно delete.php: а) проверили ли вы, что данные «выглядят» так, как вы ожидаете? например через var_export ($ _ POST) b) проверили ли вы, что for-loop/if-statement вводится хотя бы один раз? например распечатайте запрос перед отправкой его на сервер sqlserver. c) для возвращаемого значения sqlsrv_query() нет обработки ошибок, см. https://msdn.microsoft.com/en-us/library/cc296200%28v=sql.105%29.aspx – VolkerK

ответ

0
<?php 
if (!isset($_POST["chkDel"]) || !is_array($_POST["chkDel"])) { 
    die('missing or wrong parameter "chkDel"'); 
} 

$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)); 
} 

$query = 'DELETE FROM dbo.modIndex WHERE ID=?'; 
$stmt = sqlsrv_prepare($conn, $query, array(&$id)); 
if(!$stmt) { 
    die(print_r(sqlsrv_errors(), true)); 
} 

foreach($_POST["chkDel"] as $id) { 
    if(!sqlsrv_execute($stmt)) { 
     die(print_r(sqlsrv_errors(), true)); 
    } 
} 
+0

VolkerK - вы - Человек! Спасибо за помощь. Я новый, что мне пришлось использовать prepare и exec, но у меня были проблемы, связанные с этим. Еще раз спасибо, все отлично работает! – ThomasW

0

Я изменяю код, так как 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 - Имя - Email - CountryCode - Бюджет - Используется.

I`m новичок в SQL PHP, и это сложнее, учитывая, что в Интернете не так много учебных пособий относительно mssql и php.

Благодарим всех вас за помощь и советы.

+0

Вы не можете передать предложение WHERE в качестве параметра (ов) к sqlsrv_query(). Взгляните на примеры по адресу http://docs.php.net/sqlsrv_query – VolkerK

+0

Я провожу много времени, пытаясь создать форму редактирования, чтобы редактировать выбранные строки записей checbox. Есть ли возможность конвертировать delete.php, чтобы разрешить редактирование выбранной строки записей. Я упомянул delete.php, так как считаю, что при редактировании будет использоваться simillar. Я попытался это сделать, но у меня возникли проблемы с отображением выбранной записи для редактирования в отдельной форме. В этом случае я повторно использую форму insert.php. Любая помощь? Спасибо, – ThomasW