【问题标题】:Insert into table white result插入表格白色结果
【发布时间】:2023-03-22 18:21:01
【问题描述】:

我正在尝试插入 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
)

config.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 收到这个

NULL string(259) "INSERT INTO prenotazione (名词、电子邮件、数据、orario_inizio、orario_fine、oggetto、名词性、电子邮件、名词性、电子邮件、节) 值('aaa aaaa','aaa@email.com','2018-10-04','09:30','12:30','aaaaa','bbbb bbbb','bbbb@email.com','cccc ccc','cccc@email.com',1)"

在您看来,我该如何解决这个问题? 谢谢

【问题讨论】:

  • 尝试在准备 if (!$stmt) { echo "\nPDO::errorInfo():\n"; print_r($dbh-&gt;errorInfo()); die(); } 之后粘贴此错误。假设您正在使用 PDO
  • 感谢您的回答!结果如下: string(1) "0" string(246) "INSERT INTO prenotazione (nominativo,email,data,orario_inizio,orario_fine,oggetto,nominativoi,emaili,nominativoe,email,stanza) VALUES ('aaa aaaa', 'aaa@email.com','2018-10-04','09:30','12:30','aaaa','bbb','bbb@email.com','cccc','ccc @email.com',1)"
  • 在 PHPMyAdmin 中尝试该查询,看看它是否返回任何错误
  • @Mike 为什么在我的 PhPMyAdmin 中?我正在使用 postgres
  • 我的意思是,尝试在你的 mysql 数据库而不是你的代码中运行它。检查查询是否正确。

标签: php database postgresql


【解决方案1】:

MySQL 的语法非常宽松,如果您不是数据库专家,这可能是一个加分项,但当它做出错误假设时可能会导致“令人惊讶的”错误。 另一方面,PostgreSQL 在数据定义方面往往非常严格。你已经告诉 Postgres 你的字段被命名为:

"nominativo " 带引号和空格,不是 nominativo

带有引号和空格的“email”,而不是电子邮件

"oggetto" 带引号和空格,而不是 oggetto

"nominativoi" 带引号和空格,而不是 nominativoi

"nominativoe" 带引号和空格,而不是 nominativoe

所以它是说你 nominativo、email、oggetto、nominativoi 和 nominativoe 列不存在。

这句话:

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

完美运行。

对于 postgres,“nominativo”和 nominativo 是不一样的,“令人惊讶的是”它们是用于 MySQL 的

【讨论】:

  • 感谢您的回答!!我在 $query1 = "INSERT INTO prenotazione ("nominativo","email",data,orario_inizio,orario_fine,"oggetto","nominativoi","emaili","nominativoe","email",stanza) 值(' $nominativoi','$email','$data','$orario_inizio','$newTimeEnd','$oggetto','$nominativoi','$emaili','$nominativoe','$email',1 )";但我收到此错误: Parse error: syntax error, unexpected 'nominativo' (T_STRING) in C:\xampp\htdocs\PhpProject1\input.php on line 44
  • 另外...(这不是一个错误,但要小心)当心模式,如果你将表定义为 public.prenotazione 它只能在公共模式是你当前模式时被称为 prenotazione ,您可能会发现它在数据库托管上不正确(即),因此只需将 table 定义为 prenotazione 并且不要假设 public 是您的默认架构或将其用作 public.prenotazione。
  • 你需要转义双引号 \"nominativo \" 而不是 "nominativo" 因为你的 PHP 字符串是双引号的。不要忘记你的空白:)
  • 不客气。这里的原罪是用空格命名表,postgres 只是让你知道你正在这样做,以防你不知道,想象一下“愚蠢”的场景,当你有列“nominativo”和 nominativo 不一定在同一张桌子上但是在同一个 SELECT 上,您可能会开始喜欢“严谨”的 postgres 而不是“冷漠”的 mysql ^_^
  • 添加一个尝试 -> 捕获块并转储错误消息,您无法在不知道发生了什么的情况下调试错误,您可以在此处阅读:secure.php.net/manual/en/pdo.error-handling.php 或者您可以查看 postgres 日志,但它们可能大多数记录器设施都有一点延迟。
【解决方案2】:

请记住,对于 PHP,比较 null == 0 将得到 true

然后您的脚本将 if 条件 $prenotato == 0 AND $stanza == 0 解析为 TRUE 和 TRUE 并继续打印第二个 var 转储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2015-06-28
    • 2014-10-20
    • 2021-01-23
    • 2014-04-29
    相关资源
    最近更新 更多