Одни и те же данные сохраняются два раза? - PullRequest
2 голосов
/ 21 апреля 2020

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

<?php

    $users = array("username"=>"Kaleem", "adrress"=>"abc");

class dbase{

    public function dbinsert($table,$users)
    {
        foreach ($users as $key => $value) 
        {
            $sql = "INSERT INTO $table (`$key`) VALUES ('$value')";
            $this->conn->query($sql);
            if($this->conn->query($sql))
            {
                echo "Data inserted";
            }
        }
    }

        public function __construct ()
        {

            $this->conn = new mysqli('localhost','root','','dbase');

            if($this->conn)
            {
                echo "Connected<br>";
            }
        }


}

$obj = new dbase;
$obj->dbinsert('users',$users);
?>

Ответы [ 3 ]

3 голосов
/ 21 апреля 2020

Проблема в том, что вы вызываете функцию запроса дважды.

            $this->conn->query($sql); // saves the first time
            if($this->conn->query($sql)) // saves the second time
            {
                echo "Data inserted";
            }

Чтобы избежать повторного вызова запроса, вы можете сохранить результат запроса в переменную и проверить его в if.

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

Попробуйте это:

<?php

    $users = array( // this array is for the users
                   array("username"=>"Kaleem", "adrress"=>"abc"), // this is one user
                   array("username"=>"Mickey Mouse", "adrress"=>"Test street"),
                   );

class dbase{

    public function dbinsert($table,$users)
    {
        foreach ($users as $key => $value) 
        {
            // Extract field names
            $fields = implode("`, `", array_keys ( $users[$key] );
            // Extract values
            $values = implode("', '", array_values ( $users[$key] );

            $sql = "INSERT INTO $table (`" . $fields  . "`) VALUES ('". $values ."')";
            // Check if query was succesfull
            $success = $this->conn->query($sql);
            if($success)
            {
                echo "Data inserted";
            } else { // if no success display error message
                echo "Error while saving";
            }
        }
    }

        public function __construct ()
        {

            $this->conn = new mysqli('localhost','root','','dbase');

            if($this->conn)
            {
                echo "Connected<br>";
            }
        }


}

$obj = new dbase;
$obj->dbinsert('users',$users);
?>
1 голос
/ 21 апреля 2020

это происходит потому, что вы используете foreach () для измерения одного массива,

$users = ["username"=>"Kaleem", "adrress"=>"abc"];
foreach($users as $key=>$value){
    echo $value."\n";
}

это $success = $this->conn->query($sql); выполняется дважды, потому что array длина равна 0 и 1, если вы хотите использовать foreach Вы должны использовать многомерный массив, как

$users = [
    ["username"=>"Kaleem", "adrress"=>"abc"]
];
foreach($users as $key=>$value){
    $sql = "INSERT INTO $table (`username`, `adrress`) VALUES ('". $value['username'] ."', '". $value['adrress'] ."')";
    $this->conn->query($sql);
}
1 голос
/ 21 апреля 2020

вам нужно имя и адрес вместе как имя столбца и соответствующие значения как значения поля в sql

public function dbinsert($table,$users)
{
    $sqlKeys = []; 
    $sqlValues = [];
    foreach ($users as $key => $value) 
    {

       $sqlKeys[] = "'".$key."'";
       $sqlValues[] = "'".$value."'";
    }
    $keys = array_implode(",",$sqlKeys);
    $values = array_implode(",",$sqlValues);

    $sql = "INSERT INTO $table ($keys) VALUES ($values)";
    if($this->conn->query($sql))
    {
        echo "Data inserted";
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...