Как сделать проверку базы данных и в зависимости от результатов либо обновить, либо вставить (постоянно получаю ошибку HTTP 500) - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь создать способ проверки обновления поля ввода, который проверяет, является ли поле ввода пользователя пустым или нет. И затем в зависимости от ответа, если он пуст или не делать больше проверок. Так, например, если поле ввода пустое, я хочу, чтобы оно было проигнорировано, поэтому остальная часть кода выполняется, и если есть значение внутри поля ввода, будут сделаны еще некоторые проверки, чтобы проверить, находится ли оно в базе данных или нет, и если он не находится внутри базы данных, он должен быть вставлен в базу данных, а если он уже есть, просто обновите это поле.
Таблица является относительной к основной таблице, где inf_id является основной таблицей, а userid является реляционной, в которой я работаю

Таким образом, я пытался сделать это по-другому, но я продолжаю сталкиваться с проблемами, и каждый раз, когда я совершаю ошибку или что-то не работает, я получаю страницу HTTP 500 error, в которой говорится, что она недоступна. Я также попытался изменить name во входных данных на другие, чтобы увидеть, работает ли этот эффект и другие макеты или что-то другое, но я чувствую, что это что-то маленькое, что я пропускаю на
тоже устал, но я, возможно, сделал это неправильно, так как я никогда не использовал это раньше

IF EXISTS (SELECT count(*) FROM `table` WHERE inf_id = $infid)
   BEGIN UPDATE GOES HERE END ELSE BEGIN INSERT GOES HERE END

Это мой Код в форме, чтобы проверить, есть ли в базе данных входные данные, если нет, то создается пустой ввод. Однако, если в базе данных есть значения, она выдает их

$vId = $_GET['i']; //this is the users unique ID that is send in the query string for testing purpose

if (mysqli_num_rows($rs_username) == 0 ){
   echo '<input type="text" name="currentusername[]" class="currentusername" placeholder="Current Bikes" >';
} else {
   while ($rs_bike_rows = mysqli_fetch_assoc($rs_bikes)) {
       echo '<input type="text" name="currentusername[]" class="currentusername" value="' . $row['currentusername'] . '">';
       echo '<input type="hidden" name="userid[]" value="' . $row['userid'] . '">';
       echo '<button type="button" onclick="return deleteFromDbBike('. $rs_bike_rows['oid'] .', '. $vId .');">Delete</button>';
   }
}

Это для очистки входных данных, которые пользователь вводит в файл процесса

if (isset($_POST['currentusername']) && $_POST['currentusername'] !== '') {
    $currentusername = $_POST['currentusername'];
    $allusername = '';

    foreach ($vcurrentbike as $users) {
         $allusername .= $users. ' ';
    }

    if (filter_var($allusername , FILTER_SANITIZE_STRING) === null) {
        $vValidation++;
    }
} else {
   $currentusername= '';
}

позже в файле процесса, чтобы затем проверить входное значение и обновить / вставить его

$user = $_POST['userid'];

if ($currentusername != '') {
     for ($i = 0; $i < count($user); $i++) {
        $userid = $bike[$i];
        $valueuser = $currentusername[$i];

        $sqlcheck = "Select `inf_id` FROM usertable WHERE inf_id = $vId";
        $resultcheck = mysqli_query($conn,$sqlcheck);

        if (mysqli_num_rows($resultcheck) >= 1) {
            $stmt = $conn->prepare("UPDATE usertable SET currentusername = ? WHERE inf_id = ? and userid = ?");
            $stmt->bind_param("sii", $currentperson, $infid, $ownedid);

            $currentperson = $valueuser ;
            $infid = $vid;
            $ownedid = $userid;

            $stmt->execute();

            //the update code works (tried and tested) just using 
            //exit to see where the code goes.
            exit('1');

         } else {
            //this is where the insert value would be however I can  
            //never get it to echo 0 when it exits; instead i just get a HTTP 500;
            exit('0');
         }

     };
} else {
   exit('fails');
}

В конце я хочу, чтобы он мог проверить, вводил ли пользователь значения, а затем, в зависимости от того, имеют они или нет, либо вставить, либо обновить. и если пользователь не просто проигнорировал это. и перейти на следующее поле

Редактировать это в основном имеет 2 уровня к этому утверждению
Уровень 1:
1.1) если пользовательский ввод пуст, игнорируйте его полностью.
1.2) если пользовательский ввод имеет значение, проверьте его по базе данных
Уровень 2:
2.1) если значение существует в базе данных, обновите значения
2.2) если значения не существуют, вставьте их в базу данных.
Ошибка, с которой я сталкиваюсь, состоит в том, что, если значение не находится в базе данных, для начала оно создаст пустое поле ввода.
Теперь, когда пользователь добавляет текст в пустое поле, он хочет обновить его, но его не существует. так что из-за ошибок у меня как обновить нечего
Состояния поля ввода могут быть:
1) пусто без значения
2) Имеет добавленное значение, поэтому его нет в db
3) имеет значение от первоначального представления формы в дБ

РЕДАКТИРОВАТЬ 2: добавить еще кнопку

<button type="button" onclick="addMoreRows('user')"> Add More Current Usernames</button>
<div id="currentuser"></div>
var itemTypes = {
    user:{
        maxLimit: 4,
        currentCount: 1,
        selector: '#currentuser',
        newElement: '<div class="moreusersadd"><input type="text" name="currentusernameadd[]" class="currentusernameadd" placeholder="Current Bikes" ><button class="delete" onclick="deleteRow(this, \'user\')">Delete</button></div>'
    }
}
function addMoreRows(type){
    var item = itemTypes[type];
    if (item.currentCount < item.maxLimit) {
        item.currentCount++;
        $(item.selector).append(item.newElement);
    }
    else {
        alert('You Have Reached the limits')
    }
}
function deleteRow(event, type){
  $(event).parent('div').remove();
  itemTypes[type].currentCount--;
};

1 Ответ

0 голосов
/ 28 марта 2019

Я думаю, это то, что вы хотите.

Я использовал свою собственную таблицу пользователей в качестве примера, но вы можете просто изменить запросы на свои собственные таблицы и столбцы.

Если у вас есть какие-либо проблемы с этим, просто покажите нам вашу полную структуру таблицы, и я могу ее обновить.

<?php
include_once("web/connection.php");

echo "<form method='POST' action='test.php'>";
echo "<table>";
$sql = "SELECT * FROM users";
$stmt = DB::run($sql);
$count = $stmt->rowCount();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $id = $row['id'];
    $username = $row['username'];
    $password = $row['password'];
    echo "<tr>";
    echo "<td><input type='text' name='username_".$id."' value='".$username."'></td>";
    echo "<td><input type='text' name='password_".$id."' value='".$password."'></td>";
    echo "</tr>";
}
echo "<tr>";
echo "<td><input type='text' name='username' placeholder='Username'></td>";
echo "<td><input type='text' name='password' placeholder='Password'></td>";
echo "</tr>";
echo "<tr><td colspan='2'><input type='submit'></td></tr>";
echo "</table>";
echo "</form>";

for($i=1; $i<=$count; $i++){
    if(isset($_POST['username_'.$i]) && isset($_POST['password_'.$i])){
        $username = $_POST['username_'.$i];
        $password = $_POST['password_'.$i];

        $params = [$username,$password,$i];
        $sql = "UPDATE users SET username=?, password=? WHERE id=?";
        $stmt = DB::run($sql,$params);
    }
}

if(isset($_POST['username']) && isset($_POST['password'])){
    $username = $_POST['username'];
    $password = $_POST['password'];

    $params = [$username,$password];
    $sql = "INSERT INTO users (username, password) VALUES (?,?)";
    $stmt = DB::run($sql,$params);
}
?>

// ----- EDIT ----- //

Так что теперь у него есть добавленный заголовок для обновления страницы и обновления таблицы после каждой отправки.

Я также добавил проверку, чтобы убедиться, что новые поля не были пустыми, поэтому не добавлялась пустая строка. И теперь вы также можете добавить столько строк ввода, сколько захотите.

<?php
session_start();
include_once("web/connection.php");

echo "<form method='POST' action='test.php'>";
echo "<table>";
$sql = "SELECT * FROM users";
$stmt = DB::run($sql);
$count = $stmt->rowCount();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $id = $row['id'];
    $username = $row['username'];
    $password = $row['password'];
    echo "<tr>";
    echo "<td><input type='text' name='username_".$id."' value='".$username."'></td>";
    echo "<td><input type='text' name='password_".$id."' value='".$password."'></td>";
    echo "</tr>";
}
if(isset($_POST['no_of_inputs'])){
    $_SESSION['new_number'] = $_POST['no_of_inputs'];
    for($i=1; $i<=$_SESSION['new_number']; $i++){
        echo "<tr>";
        echo "<td><input type='text' name='new_username_".$i."' placeholder='Username'></td>";
        echo "<td><input type='text' name='new_password_".$i."' placeholder='Password'></td>";
        echo "</tr>";
    }
}
echo "<tr><td colspan='2'><input type='submit'></td></tr>";
echo "</table>";
echo "</form>";

echo "<form method='POST' action='test.php'>";
echo "Add <input type='number' name='no_of_inputs' onchange='this.form.submit()'> rows";
echo "</form>";

for($i=1; $i<=$count; $i++){
    if(isset($_POST['username_'.$i]) && isset($_POST['password_'.$i])){
        $username = $_POST['username_'.$i];
        $password = $_POST['password_'.$i];

        $params = [$username,$password,$i];
        $sql = "UPDATE users SET username=?, password=? WHERE id=?";
        $stmt = DB::run($sql,$params);
    }
}

if(isset($_SESSION['new_number'])){
    for($i=1; $i<=$_SESSION['new_number']; $i++){
        if((isset($_POST['new_username_'.$i]) && $_POST['new_username_'.$i]!="") && (isset($_POST['new_password_'.$i]) && $_POST['new_password_'.$i]!="")){
            $username = $_POST['new_username_'.$i];
            $password = $_POST['new_password_'.$i];

            $params = [$username,$password];
            $sql = "INSERT INTO users (username, password) VALUES (?,?)";
            $stmt = DB::run($sql,$params);
            header('location: test.php');
            unset($_SESSION['new_number']);
        }
    }
}
?>

Это работает и проверено, но если вы хотите, базовая структура таблицы:

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(255) NOT NULL,
 `password` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
)

В отношении соединения вы можете изменить запросы так, как я их сделал, так:

Вместо:

$params = [$username,$password];
$sql = "INSERT INTO users (username, password) VALUES (?,?)";
$stmt = DB::run($sql,$params);

Вы могли бы сделать что-то вроде этого:

$stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?,?)");
$stmt->bind_param($username,$password);
$stmt->execute();
...