如何进行数据库检查并根据结果更新或插入(不断收到HTTP 500错误)

问题描述 投票:0回答:1

我正在尝试构建一种方法来执行输入字段更新检查,以查看用户输入字段是否为空。然后根据答案,如果它是空的或不做更多的检查。因此,例如,如果输入字段为空,我希望它被忽略,因此其余代码运行,如果输入字段中有值,则会进行更多检查以检查它是否在数据库内,并且如果它不在数据库中,那么它必须插入到数据库中,如果它已经存在,那么只需更新该字段。 该表是主表的关系表,其中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)具有来自db的初始提交表单的值

编辑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--;
};

php mysqli sql-update
1个回答
0
投票

我想这就是你想要的。

我使用自己的用户表作为示例,但您应该只能将查询更改为您自己的表和列。

如果您有任何问题,只需向我们展示您的全表结构,我就可以更新它。

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

// - - -编辑 - - -//

所以这现在有了添加的标题来刷新页面并在每次提交后更新表格。

我还添加了一个检查,以确保新字段不是空白,因此它没有添加空行。现在,您还可以根据需要添加任意数量的输入行。

<?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();
© www.soinside.com 2019 - 2024. All rights reserved.