我想在postgres表中插入一个。但我不明白为什么会失败。(我在mysql中试过了,它很管用)。
这是我的数据库:

CREATE TABLE public.prenotazione
(
    id integer NOT NULL DEFAULT nextval('prenotazione_id_seq'::regclass),
    "nominativo " character(45) COLLATE pg_catalog."default",
    "email " character(45) COLLATE pg_catalog."default",
    "oggetto " character(200) COLLATE pg_catalog."default",
    orario_inizio time(6) without time zone,
    orario_fine time(6) without time zone,
    "nominativoi " character(200) COLLATE pg_catalog."default",
    emaili character(200) COLLATE pg_catalog."default",
    "nominativoe " character(200) COLLATE pg_catalog."default",
    emaile character(200) COLLATE pg_catalog."default",
    stanza integer,
    data date
)

配置.php
<?php
$dbname = "postgres";
$host = "localhost";
$username = "postgres";

$dbh = new PDO("pgsql:dbname=$dbname;host=$host", $username, 123456789 );
?>

这是我的输入文件。
<?php
//Connecting to db here

require ('config.php');

// Richiedente
$nominativo = $_POST['nominativo'];

$email = $_POST['email'];
$oggetto = $_POST['oggetto'];
$data = $_POST['data'];
$orario_inizio = $_POST['orario_inizio'];
$orario_fine = $_POST['orario_fine'];
$stanza = 0;

// Personale Interno
$nominativoi = $_POST['nominativoi'];
$emaili = $_POST['emaili'];

// Persona Esterno
$nominativoe = $_POST['nominativoe'];
$emaile = $_POST['emaile'];

//aggiunta di un'ora ( per tornare indietro cambiare $newTimeEnd con $orario_fine
$dateTime = DateTime::createFromFormat('H:i', $orario_fine);
$dateInterval = DateInterval::createFromDateString('1 hour');

$dateTime->add($dateInterval);

$newTimeEnd = $dateTime->format('H:i');


//checkdata = query per il controllo delle prenotazioni.
$checkdata = "SELECT count(*) as prenotato
  FROM Prenotazione
 WHERE data='$data'
   AND NOT ('$newTimeEnd' < orario_inizio OR orario_fine < '$orario_inizio')";

$querycheck = $dbh->prepare($checkdata);
$querycheck->execute();
$prenotato = $querycheck->fetch()[0];
var_dump($prenotato);
if ($prenotato == 0 AND $stanza == 0 ) {
$query1 = "INSERT INTO prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile,stanza) VALUES ('$nominativo','$email','$data','$orario_inizio','$newTimeEnd','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile',1)";
    var_dump($query1);
    $result1 = $dbh->prepare($query1);
    $result1->execute();
    $rex = 1;
    $rex = 1;
}
else if ($prenotato == 1){
    $query1 = "INSERT INTO Prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile,stanza) VALUES ('$nominativo','$email','$data','$orario_inizio','$orario_fine','$oggetto','$nominativoi','$emaili','$nominativoe','$emaile',2)";
    $result1 = $dbh->prepare($query1);
    $result1->execute();
    $rex = 1;
}
else
{
      $rex = 0;
}

?>

我收到这个和Var_Dump
空字符串(259)“插入prenotazione
(提名,电子邮件,数据,Orario_Inzio,Orario_Fine,Oggetto,提名,电子邮件,提名,电子邮件,节)
值('AAA
aaaa'、'[email protected]'、'2018-10-04'、'09:30'、'12:30'、'aaaaa'、'bbbb
bbbb','[email protected]','cccc ccc','[email protected]',1'“
你认为我怎样才能解决这个问题?
谢谢

最佳答案

mysql在语法上非常放松,如果您不是数据库专家,这可能是一个优势,但是当它做出错误的假设时,可能会导致“令人惊讶”的错误。
另一方面,postgresql在数据定义方面往往非常严格。你已经告诉Postgres你的字段名为:
带引号和空格的“nomingVO”,而不是nomingVO
带引号和空格的“电子邮件”,而不是电子邮件
带引号和空格的“oggetto”,而不是oggetto
带引号和空格的“nomingvoi”,而不是nomingvoi
带引号和空格的“nomingvoe”,不带nomingvoe
所以说你的提名、电子邮件、OGGETTO、提名和专栏都不存在。
这句话:

    INSERT INTO prenotazione (
    "nominativo ","email ",data,orario_inizio,
    orario_fine,"oggetto ","nominativoi ",emaili,
    "nominativoe ",emaile,stanza)
    VALUES ('aaa aaaa','[email protected]','2018-10-04',
    '09:30','12:30','aaaaa','bbbb bbbb','[email protected]','cccc
    ccc','[email protected]',1);

工作完美。
对于Postgres来说“nomingVO”和nomingVO是不一样的,“令人惊讶的是”它们是针对MySQL的

09-16 04:23