Перезаписать данные в таблице postgresql php

Данные, представленные в таблице postgresql, больше не обновляются. Я хочу перезаписать данные. Когда я просто использую вставку, добавляются новые данные, но старые данные остаются. Я пытался использовать обновление, но потом получаю ошибки. Я хотел бы обновить все записи. Я думаю, что это, вероятно, что-то с синтаксисом. Но не могу найти проблему.

Код

$dbname = "dbtest";
$host = "localhost";
$username = "postgres";
$password = "pasword";

$dbh = new PDO("pgsql:dbname=$dbname; host=$host", $username, $password);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$c = array("Human","Mouse","Rat","Hamster","SV40");       
$b = array("Human HBO gene", "Mouse BB gene", "Human CCB gene", "SV40 TP gene", "Hamster TP53 gene");
$count=0;
foreach($c as $key => $d){
    $e =$b[$key];
    $name = $count++;
    if (strpos($e, $d) !== FALSE) {
        $match = $d;
        $specie = $d;
        $specie = str_replace("Human","Homo Sapiens",$specie);
        $specie = str_replace("Mouse","Mus Musculus",$specie);
        $specie = str_replace("Rat","Rattus norvegicus",$specie);
        $Specie = str_replace("Hamster", "Mesocricetus Auratus",$specie);
        $specie = str_replace("SV40","Simian virus 40",$specie);
    }else{
        $match = "0";
        $specie = "0";
    }

echo $match. " ". $specie. " ";

$var_id = $name;
$var_match = $match;
$var_full_name = $specie;


    #$sql = "INSERT INTO species (id,match,full_name) VALUES ('".$var_id."','".$var_match ."','".$var_full_name."')";
    $sql = "UPDATE species SET id = '".$var_id."', match = '".$var_match ."', full_name='".$var_full_name."'";
    if ($dbh->query($sql)) {
        echo "New Record Inserted Successfully!<br \>\n";
    }else{
        echo "Data not successfully Inserted.<br \>\n";
    } 
}

Ошибка, которую я получаю:

Неустранимая ошибка: Uncaught PDOException: SQLSTATE [42601]: синтаксическая ошибка: 7 ОШИБКА:> синтаксическая ошибка в или рядом с «Sapiens» LINE 1: ...species SET id = '0', match = Human, full_name = Homo Sapiens' ^ в /var/www/html/test/Insert.php:59 Трассировка стека: #0 /var/www/html/test/Insert.php(59): PDO->query('ОБНОВЛЕНИЕ видов...') # 1 {main} добавлено в /var/www/html/test/Insert.php в строке 59


person Nemo    schedule 18.05.2018    source источник
comment
Следите за своими делами: $specie и $Specie. В вашем запросе вам, вероятно, нужно добавить where id=$id, если вы не хотите обновлять ВСЕ записи. При обновлении вы также не хотите обновлять id этой конкретной записи.   -  person brombeer    schedule 18.05.2018
comment
Я хотел бы обновить все записи.   -  person Nemo    schedule 18.05.2018
comment
тогда какие ошибки вы получаете?   -  person FatFreddy    schedule 18.05.2018
comment
хм, запрос, который вы создаете, это ОБНОВЛЕНИЕ видов SET id = '0', match = 'Human', full_name = 'Homo Sapiens', который не соответствует ошибке, причина кавычек   -  person FatFreddy    schedule 18.05.2018
comment
Я знаю, что этот конкретный пример не показывает прямых доказательств использования пользовательского ввода напрямую, но даже в этом случае вы ДЕЙСТВИТЕЛЬНО не должны создавать SQL-запросы, добавляя строки. Он вызывает проблемы как по злонамеренным причинам (bobby-tables.com), так и по случайным причинам (я видел более чем достаточно приложений БД падают, когда кто-то вводит свою фамилию как О'Лири). PDO предоставляет готовые операторы, я настоятельно рекомендую вам их использовать.   -  person GordonM    schedule 08.06.2018
comment
Возможный дубликат: stackoverflow.com/questions/7600661/   -  person GordonM    schedule 08.06.2018


Ответы (2)


Вы должны использовать запрос выбора, чтобы определить, является ли значение новым или старым. Если старые данные обновления, иначе вставьте данные.

ФУНКЦИЯ

function execute_query($query,$dbh){
    if ($dbh->query($query)) {
        return "New Record Inserted Successfully!<br \>\n";
    }else{
        return "Data not successfully Inserted.<br \>\n";
    } 
}

ВЫБРАТЬ

$query = 'SELECT * FROM tbl '. 'WHERE "test1" = '. 
        "'".$var_test."'" . 'AND "test2" = '. 
        "'".$var_test2."'";
        $stmt = $dbh->prepare($query);
        $stmt->execute();
        $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);

        $outcome = $stmt->fetch();

ОБНОВИТЬ

        if ($outcome !== false){
            $sql = "UPDATE tbl SET test1 = '".$var_test1."', test2 = '".$var_test2."', 
            test3 = '".$var_test3."'
            "WHERE id = '".$var_id."' ";
            execute_query($sql,$dbh);

ВСТАВЛЯТЬ

    }else{    
        $sql = "INSERT INTO genes 
        (id,test1,test2,test3) 
        VALUES ('".$var_id."','".$var_test1 ."','".$var_test2."','".$var_test3."')";
        execute_query($sql,$dbh);
    }
person ageans    schedule 08.06.2018
comment
Все они потерпят неудачу, если какой-либо из входных данных когда-либо будет содержать апостроф ('), и все они могут быть использованы с помощью атак SQL-инъекций. - person GordonM; 08.06.2018
comment
если переменная содержит ('), вы можете установить всю переменную в строку перед вставкой с помощью settype. settype($var_test1, строка). Атака с внедрением SQL будет проблемой, если вы используете код для себя для извлечения данных. Тогда вам нужно адаптировать свой код, чтобы предотвратить эту атаку? - person ageans; 08.06.2018
comment
Как settype должен помочь? Если ввод начинается как строка с апострофом в ней, после этого она все равно будет строкой с апострофом. Любая переменная, которую вы хотите вставить в любой SQL-запрос, должна быть вставлена ​​через подготовленные операторы. - person GordonM; 08.06.2018
comment
Я не знаю, почему это работает, но это работает в моем случае, когда в одном из моих вставляемых данных присутствует символ '. - person ageans; 11.06.2018

Когда я использую следующий синтаксис, ошибка исчезает. Этот запрос необходимо использовать для обновления.

$sql = "UPDATE species SET match ='".$var_match ."', full_name='".$var_full_name."' WHERE id = '".$var_id."' ";
person Nemo    schedule 24.05.2018
comment
Он будет работать до тех пор, пока любая из ваших заменяемых переменных не будет содержать символ ', после чего она умрет. И да поможет вам Бог, если кто-нибудь введет Robert'); DROP TABLE some_table_full_of_vital_data;-- в ваше приложение! bobby-tables.com Пожалуйста, научитесь использовать функцию подготовленных операторов PDO. - person GordonM; 08.06.2018