简体   繁体   English

插入表白色结果

[英]Insert into table white result

i'm trying to do an insert into a Postgres table. 我正在尝试插入Postgres表。 But i don't understand why it fails. 但我不明白为什么它会失败。 ( I tried in mysql and it works ). (我试过mysql,它的工作原理)。 This is my database: 这是我的数据库:

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
)

config.php config.php文件

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

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

This is my input file. 这是我的输入文件。

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

?>

And i receive this with var_dump 我用var_dump收到了这个

NULL string(259) "INSERT INTO prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile,stanza) VALUES ('aaa aaaa','aaa@email.com','2018-10-04','09:30','12:30','aaaaa','bbbb bbbb','bbbb@email.com','cccc ccc','cccc@email.com',1)" NULL string(259)“INSERT INTO prenotazione(nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,emaile,stanza)VALUES('aaa aaaa','aaa @ email.com','2018- 10-04','09:30','12:30','aaaaa','bbbb bbbb','bbbb @ email.com','cccc ccc','cccc @ email.com',1)“

In your opinion how can i do to solve this problem? 在您看来,我该怎么做才能解决这个问题? Thank 谢谢

MySQL is very relaxed with syntax, this might be a plus when you are not a database expert but can lead to "surprising" errors when it makes wrong assumptions. MySQL在语法方面非常放松,当你不是数据库专家时,这可能是一个加分,但是当它做出错误的假设时可能会导致“令人惊讶”的错误。 On the other hand PostgreSQL tends to be very strict when it comes to data definition. 另一方面,PostgreSQL在数据定义方面往往非常严格。 You have told Postgres your fields are named: 你告诉Postgres你的字段命名为:

"nominativo " with quotes and blank space, not nominativo “nominativo”有引号和空格,不是nominativo

"email " with quotes and blank space, not email 带有引号和空格的“电子邮件”,而不是电子邮件

"oggetto " with quotes and blank space, not oggetto “oggetto”有引号和空格,而不是oggetto

"nominativoi " with quotes and blank space, not nominativoi “nominativoi”有引号和空白,而不是nominativoi

"nominativoe " with quotes and blank space, not nominativoe “nominativoe”有引号和空格,不是nominativoe

So it is saying you nominativo, email, oggetto, nominativoi and nominativoe columns do not exist. 所以它说你不存在nominativo,email,oggetto,nominativoi和nominativoe专栏。

This sentence: 这个句子:

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

Works perfectly. 完美的工作。

For postgres "nominativo " and nominativo are not the same, "surprisingly" they are for MySQL 对于postgres“nominativo”和nominativo不一样,“令人惊讶”它们是针对MySQL的

Remember that for PHP comparing null == 0 will result to true . 请记住,对于PHP,比较null == 0将导致为true

Your script is then resolving the if condition $prenotato == 0 AND $stanza == 0 as TRUE and TRUE and proceed to print the second var dump. 然后,您的脚本将if条件$prenotato == 0 AND $stanza == 0解析为TRUE和TRUE,然后继续打印第二个var转储。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM