Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzanie poprawności przedziałów
Forum PHP.pl > Forum > PHP
nexis
Mam tabelę w bazie danych o następującej strukturze:

Kod
+++++++++++++++++++++++++++
+     od +     do + marza +
+++++++++++++++++++++++++++
+   0.00 +  99.99 + 10.00 +
+ 100.00 + 199.99 + 20.00 +
+ 200.00 + 299.99 + 30.00 +
+ 280.00 + 399.99 + 40.00 +
+++++++++++++++++++++++++++


która zawiera przedziały cenowe wraz z odpowiednimi prowizjami. Przy wprowadzaniu wartości chciałbym sprawdzać, czy poszczególne przedziały cenowe na siebie nie nachodzą i chciałem do tego wykorzystać transakcje. Jak jednak w łatwy sposób ustalić, czy przedziały faktycznie na siebie nie nachodzą? W powyższym przykładzie ostatni wpis jest nieprawidłowy, ponieważ nachodzi na przedostatni.

Drugim problemem było sprawdzenie czy nie ma pustych zakresów, tzn. że jest przerwa między przedziałami (dokładność do jednego grosza, maksymalna wartość 99 999 999.99, czyli DOUBLE(10,2)).
Darti
na przykładzie, może coś zauważysz co Cie naprowadzi winksmiley.jpg
100 - 99.9 = 0.01
200 - 199.99 = 0.01
280 - 299.99 = -19.99
nexis
Cytat(Darti @ 13.12.2008, 21:18:57 ) *
na przykładzie, może coś zauważysz co Cie naprowadzi winksmiley.jpg
100 - 99.9 = 0.01
200 - 199.99 = 0.01
280 - 299.99 = -19.99


  1. <?php
  2. if ($_POST['from'] >= $_POST['to']) {
  3.   exit('End value must be larger than start value!');
  4. }
  5. // Begin transaction
  6. $this->db->beginTransaction();
  7. $query = sprintf
  8.   (
  9.      "INSERT INTO `comission` (`from`, `to`, `comission`) VALUES ('%01.2f', '%01.2f', '%01.2f')",
  10.      $_POST['from'],
  11.      $_POST['to'],
  12.      $_POST['comission']
  13.   );
  14. $this->db->query($query);
  15. // Search for overlapping values or empty spaces
  16. try {
  17.   $query = "SELECT `from`, `to` FROM `comission` ORDER BY `from` ASC";
  18.   $last  = -0.01;
  19.   foreach ($this->db->fetchAll($query) as $row) {
  20.      $diff = round($row['from']-$last, 2);
  21.      if ($diff != 0.01) {
  22.         if ($diff > 0.01)
  23.            throw new Exception('Empty spaces between values!');
  24.         else
  25.            throw new Exception('Overlapping values!');
  26.      }
  27.      $last = $row['to'];
  28.   }
  29.   $this->db->commit();
  30. } catch (Exception $e) {
  31.   $this->db->rollBack();
  32.   exit($e->getMessage());
  33. }
  34. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.