Sql注入无需覆盖

时间:2015-06-12 09:03:06

标签: php sql

我有一个php脚本,用于填充我的sql数据库中的表。问题是它每次运行时都会覆盖表格,我只想在最后添加数据。我从我修改的现有脚本中获取灵感,但我不了解它所包含的全部内容。

这是我的代码:

<?php

  try {

    session_start();
    require_once('./lib/demo/php/functions.php');

    $db = getConnection();

    $colMap = array(
      0 => "LIBELLE",
      1 => "DESCRIPTION",
      2 => "CODE"
    );

    if (isset($_GET['data']) && $_GET['data']) {
      $select = $db -> prepare('DELETE FROM COMPETENCES');
      $select2 = $db -> prepare('DELETE FROM DESCRIPTION');

      $select -> execute();
      $select2 -> execute();

      for ($r = 0, $rlen = count($_GET['data']); $r < $rlen; $r++) {
        $rowId = $r + 1;
        for ($c = 0, $clen = count($_GET['data'][$r]); $c < $clen; $c++) {
          if (!isset($colMap[$c]) && !isset($colMap[$c])) {
            continue;
          }

          $newVal = $_GET['data'][$r][$c];

          $select = $db -> prepare('SELECT ID FROM COMPETENCES WHERE ID=? LIMIT 1');
          $select2 = $db -> prepare('SELECT ID FROM DESCRIPTION WHERE ID=? LIMIT 1');

          $select -> execute(array($rowId));
          $select2 -> execute(array($rowId));

          if ($row = $select->fetch() && $row = $select2->fetch()) {
            $query = $db->prepare('UPDATE COMPETENCES SET `' . $colMap[$c] . '` = :newVal WHERE ID = :id');
            $query2 = $db->prepare('UPDATE DESCRIPTION SET `' . $colMap[$c] . '` = :newVal2 WHERE ID = :id2');

          } else {
            $query = $db->prepare('INSERT INTO COMPETENCES (ID, `' . $colMap[$c] . '`) VALUES(:id, :newVal)');
            $query2 = $db->prepare('INSERT INTO DESCRIPTION (ID, `' . $colMap[$c] . '`) VALUES(:id2, :newVal2)');
          }

          $query->bindValue(':id', $rowId, PDO::PARAM_INT);
          $query2->bindValue(':id2', $rowId, PDO::PARAM_INT);

          $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
          $query2->bindValue(':newVal2', $newVal, PDO::PARAM_STR);

          $query->execute();
          $query2->execute();

        }
      }
    }

    $out = array(
      'result' => 'ok'
    );
    echo json_encode($out);

    closeConnection($db);
  }
  catch (PDOException $e) {
    print 'Exception : ' . $e->getMessage();
  }
?>
}

我认为删除DELETE查询会解决问题,但脚本根本不起作用。我认为问题来自于ID,但我找不到。

数据来自使用javascript插件Handsontable创建的网格。

你能帮帮我吗?我真的需要这个脚本。

1 个答案:

答案 0 :(得分:0)

我的脚本仍然无效,但我删除了所有无用的内容。现在,即使新代码看起来更合适,数据库中根本没有任何事情发生。

这是新的:

<?php

  try {

   session_start();
   require_once('./lib/demo/php/functions.php');

   $db = getConnection();
   mysql_set_charset('utf8', $db);
   $colMap = array(
       0 => 'LIBELLE',
       1 => 'DESCRIPTION',
       2 => 'CODE'
   );
   if (isset($_GET['data']) && $_GET['data']) {


       for ($r = 0, $rlen = count($_GET['data']); $r < $rlen; $r++) {
           $rowId = $r + 1;

           for ($c = 0, $clen = count($_GET['data'][$r]); $c < $clen; $c++){
               if (!isset($colMap[$c])) {
                   continue;
               }

               $newVal = $_GET['data'][$r][$c];

               $query = $db->prepare('INSERT INTO COMPETENCES ("'.$colMap[$c].'") VALUES(:newVal)');
               $query2 = $db->prepare('INSERT INTO DESCRIPTION ("'.$colMap[$c].'") VALUES(:newVal2)');

               $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
               $query2->bindValue(':newVal2', $newVal, PDO::PARAM_STR);

               $query->execute();
               $query2->execute();

           }

       }

   }

   $out = array('result' => 'ok');
   echo json_encode($out);

   closeConnection($db);
}
catch (PDOException $e) {
    print 'Exception : ' . $e->getMessage();
}

?>