2013-10-27 1 views
0

У меня возникла проблема с добавлением PHP в базу данных. Каждый раз, когда я обновляю страницу, он снова вводит одни и те же значения. Как я могу заставить это прекратить это делать? Я понятия не имею, почему это так.Содержимое таблицы продолжает добавлять при обновлении страницы PHP

Я хочу, чтобы он добавлял значения в базу данных один раз и сохранял их там. Когда таблица создается и значения добавляются, они используются на странице. Пользователь будет иметь возможность добавлять дополнительные значения.

Он также добавляет все, что пользователь ввел при освежении.

Проблемная часть

$db_query = 'INSERT INTO `cars`' . 
    ' (`id`, `make`, `model`, `year`, `color`, `engine`)' . 
    ' VALUES' . 
    ' (NULL, \'Citroen\', \'Saxo\', \'1997\', \'White\', 1.1),' . 
    ' (NULL, \'Citroen\', \'C3\', \'2012\', \'Blue\', 1.4),' . 
    ' (NULL, \'Volkswagen\', \'Golf\', \'2010\', \'Blue\', 1.8),' . 
    ' (NULL, \'Ford\', \'Mondeo\', \'2009\', \'Black\', 1.6),' . 
    ' (NULL, \'Renault\', \'Clio\', \'2010\', \'Silver\', 1.2);'; 
$result = mysqli_query($conn, $db_query); 

Полный код:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>Task 7</title> 
</head> 
<body> 
<?php 


// connection to the database start 
$host = 'localhost'; 
$user = 'root'; // your username 
$password = 'vertrigo'; // your password 
$databaseName = 'db2'; // your database 

$conn = mysqli_connect($host, $user, $password, $databaseName); 

if (mysqli_connect_errno($conn)) { 
    echo 'Failed to connect to MySQL: ' . mysqli_connect_error(); 
} else { 
    echo 'have connection<br>'; 
} 
// connection to the database end (output messages created) 


// creating table with rows start 
$db_query = 'CREATE TABLE IF NOT EXISTS `cars` (' . 
    '`id` int(11) NOT NULL AUTO_INCREMENT,' . 
    '`make` varchar(50) NOT NULL,' . 
    '`model` varchar(50) NOT NULL,' . 
    '`year` varchar(4) NOT NULL,' . 
    '`color` varchar(50) NOT NULL,' . 
    '`engine` decimal(2,1) NOT NULL,' . 
    'PRIMARY KEY (`id`));'; 
$result = mysqli_query($conn, $db_query); 
// creating table with rows end 


// putting info in each column start 
$db_query = 'INSERT INTO `cars`' . 
    ' (`id`, `make`, `model`, `year`, `color`, `engine`)' . 
    ' VALUES' . 
    ' (NULL, \'Citroen\', \'Saxo\', \'1997\', \'White\', 1.1),' . 
    ' (NULL, \'Citroen\', \'C3\', \'2012\', \'Blue\', 1.4),' . 
    ' (NULL, \'Volkswagen\', \'Golf\', \'2010\', \'Blue\', 1.8),' . 
    ' (NULL, \'Ford\', \'Mondeo\', \'2009\', \'Black\', 1.6),' . 
    ' (NULL, \'Renault\', \'Clio\', \'2010\', \'Silver\', 1.2);'; 
$result = mysqli_query($conn, $db_query); 
// putting info in each end 


// add cars START 
@$cars = $_POST['cars']; 
if (isset($cars)) { 
    $db_query = "INSERT INTO cars (make, model, year, color, engine) VALUES ('".$cars['0']."','".$cars['1']."','".$cars['2']."','".$cars['3']."','".$cars['4']."')"; 
    mysqli_query($conn, $db_query); 
} else { 
    echo 'Cars array does not exists and obtained from FORM.'; 
} 
// add cars END 


// select cars table if right output the headers start 
$db_query = "SELECT * FROM cars WHERE id <> 0 ORDER BY year ASC"; 

if ($result = mysqli_query($conn, $db_query)) { 
    echo " <table border='1'>"; 
    echo "  <tr><td>Make</td><td>Year</td><td>model</td><td>color</td><td>engine</td></tr>"; 
    // select cars table if right output the headers end 

    // while start, output the content of the colum. 
    while ($row = mysqli_fetch_assoc($result)) { 
    ?> 
     <tr> 
      <td><?php echo $row['make']; ?></td> 
      <td><?php echo $row['year']; ?></td> 
      <td><?php echo $row['model']; ?></td> 
      <td><?php echo $row['color']; ?></td> 
      <td><?php echo $row['engine']; ?></td> 
     </tr> 
    <?php 
    } 
    // endwhile 

    echo "</table>"; 
} 
?> 
    <form action="index.php" method="post" name="zatupok"> 
     <fieldset> 
      <legend>MY CARS</legend> 
      <label>Make</label> 
      <input type="text" name="cars[]"> 
      <label>Model</label> 
      <input type="text" name="cars[]"> 
      <label>Year</label> 
      <input type="text" name="cars[]"> 
      <label>Color</label> 
      <input type="text" name="cars[]"> 
      <label>Engine</label> 
      <input type="text" name="cars[]"> 
      <input type="submit"> 
     </fieldset> 
    </form> 
</body> 
</html> 
+0

Я думаю, что ваш ответ здесь http://stackoverflow.com/questions/5166178/php-form-refresh-send-form-again-prevent – electroid

+0

Похоже на это. Я изо всех сил пытаюсь найти, где именно его разместить. Я все новичок в PHP, занимаюсь своими исследованиями. Можете ли вы дать мне руку, покажите мне, где ее разместить. Я загружаю весь свой код. – user2919681

+0

Ну. История, позади, действительно длинная и жуткая. Я работаю над самостоятельными исследованиями и в тот момент, когда запрос на создание PHP, который создает таблицу в SQL, а затем можно делать простые инструкции, такие как EDIT UPDATE DELETE и т. Д. Он также должен выполняться в классах не в одном файле. Это только я пытаюсь создать соединение в PHP в первый раз. Эта ссылка даст вам больше информации о том, что происходит. Надеюсь, это поможет. И да, я не знаю, как перенести это на классы после того, как он работает. http://stackoverflow.com/questions/19588347/sql-database-access-layer-with-php – user2919681

ответ

0

Почему выборочные значения добавляются на каждой странице визита

Ваш PHP код выполняется каждый раз при посещении страницы , Он генерирует страницу (записывает ее части динамически, просто копирует все за пределами <?php … ?>), страница - это результат вашего скрипта. Apache или любое другое серверное программное обеспечение, которое вы используете, просто получает HTTP-запрос, выполняет ваш скрипт, выводит его и отправляет его клиенту в ответе HTTP.

Если ваш запрос INSERT выполняется безоговорочно (как есть), он также выполняется при каждом посещении страницы. Вот почему значения добавляются снова и снова.

Как остановить добавление выборочных значений

Вы можете проверить, если таблица cars была создана и выполнить вставку запроса, только если он был:

// creating table with rows start 
// CHANGED: Notice that IF NOT EXISTS is not used anymore! 
//   Fails if table already exists, not touching its original contents. 
$db_query = 'CREATE TABLE `cars` (' . 
    '`id` int(11) NOT NULL AUTO_INCREMENT,' . 
    '`make` varchar(50) NOT NULL,' . 
    '`model` varchar(50) NOT NULL,' . 
    '`year` varchar(4) NOT NULL,' . 
    '`color` varchar(50) NOT NULL,' . 
    '`engine` decimal(2,1) NOT NULL,' . 
    'PRIMARY KEY (`id`));'; 
$result = mysqli_query($conn, $db_query); 
// creating table with rows end 


// putting info in each column start 
$db_query = 'INSERT INTO `cars`' . 
    ' (`id`, `make`, `model`, `year`, `color`, `engine`)' . 
    ' VALUES' . 
    ' (NULL, \'Citroen\', \'Saxo\', \'1997\', \'White\', 1.1),' . 
    ' (NULL, \'Citroen\', \'C3\', \'2012\', \'Blue\', 1.4),' . 
    ' (NULL, \'Volkswagen\', \'Golf\', \'2010\', \'Blue\', 1.8),' . 
    ' (NULL, \'Ford\', \'Mondeo\', \'2009\', \'Black\', 1.6),' . 
    ' (NULL, \'Renault\', \'Clio\', \'2010\', \'Silver\', 1.2);'; 
// CHANGED: Executing the query only if previous query (`CREATE TABLE …`) succeeded. 
if ($result) { 
    $result = mysqli_query($conn, $db_query); 
} 
// putting info in each end 

Refresh после проблемы POST

Еще одна проблема, с которой мы столкнулись во время отладки проблемы, обновляется после отправки формы POST. Браузер автоматически отправляет исходное содержимое формы, что является стандартным поведением. Это приводит к повторному вводу представленных значений в базу данных, теперь они сохраняются в двух или даже более копиях.

Это может быть предотвращено. См. Stop browsers asking to resend form data on refresh. Принятый ответ рекомендует шаблон POST-redirect-GET, который я бы использовал в вашем случае. Вы можете получить гораздо больше по этой теме, когда googling post data resent stackoverflow.

+0

@ user2919681 Что вам нужно сделать, это установить форму и код БД отдельно друг от друга. Кроме того, если вы хотите запустить свой код так, как он есть, то я предлагаю вам добавить 'if (isset ($ _ POST ['submit']))' в начале и под вашими учетными данными БД, а затем назовите кнопку отправки, как этот '' таким образом, что он будет выполняться только при нажатии кнопки отправки; Это ваш ** ответ. ** –

+0

@ Fred-ii- Продвинутый пользователь2919681 просто хочет убедиться, что таблица есть. Сценарий должен настроить таблицу при удалении вручную и заполнить ее данными примера. 'CREATE TABLE' создает ошибку при создании таблицы, которая уже существует в MySQL, поэтому никакие данные не записываются. 'ЕСЛИ НЕ СУЩЕСТВУЕТ' просто подавляет ошибку, но тогда ее не удалось обнаружить, была ли эта таблица уже создана или нет. – Palec

+0

@Palec Я сомневаюсь, что намерение добавления значений в БД является ** разовой вещью **. Я понимаю, что вы говорите, однако установка OP не имеет никакого смысла и должна использовать условия вместо этого. Использование 'if (isset ($ _ POST ['submit']))' является частичным решением исходной задачи. –