Обсуждение: Inserting Null Value or String Value

Поиск
Список
Период
Сортировка

Inserting Null Value or String Value

От
test test
Дата:

Hi,

I am trying to insert a date into a date field, but also sometimes I need to insert a null value.  Inserting the null value seems to require not using quotes around null, but if I try to enter a date without quotes around it, it thinks it is a number.

Here is the error I get: Warning: PostgreSQL query failed: ERROR: column "spec_start_date" is of type 'date' but expression is of type 'integer' You will need to rewrite or cast the expression

The value I am sending is: spec_start_date = 10/01/02

If I surround the date with single quotes it should be fine, but I can't do that when I want to insert a null value.  I know that I can do an "IF <use quotes> ELSE <don't use quotes>" in the SQL string, by I am entering many values and this would really get messy. I was hoping that there was a better solution. Thanks for any help.

Sean



Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!

Re: Inserting Null Value or String Value

От
Keary Suska
Дата:
on 10/1/02 10:54 AM, dcmkx10@yahoo.com purportedly said:

I am trying to insert a date into a date field, but also sometimes I need to insert a null value.  Inserting the null value seems to require not using quotes around null, but if I try to enter a date without quotes around it, it thinks it is a number.

Here is the error I get: Warning: PostgreSQL query failed: ERROR: column "spec_start_date" is of type 'date' but expression is of type 'integer' You will need to rewrite or cast the expression

The value I am sending is: spec_start_date = 10/01/02

If I surround the date with single quotes it should be fine, but I can't do that when I want to insert a null value.  I know that I can do an "IF <use quotes> ELSE <don't use quotes>" in the SQL string, by I am entering many values and this would really get messy. I was hoping that there was a better solution. Thanks for any help.

If there is a way, I haven't found it yet. But it doesn't have to be messy--simply create a function that does the if-else for you, and your code will stay clean.

Keary Suska
Esoteritech, Inc.
"Leveraging Open Source for a better Internet"

Re: Inserting Null Value or String Value

От
Roland Roberts
Дата:
>>>>> "Keary" == Keary Suska <hierophant@pcisys.net> writes:

    Keary> If I surround the date with single quotes it should be
    Keary> fine, but I can't do that when I want to insert a null
    Keary> value.  I know that I can do an "IF <use quotes> ELSE
    Keary> <don't use quotes>" in the SQL string, by I am entering
    Keary> many values and this would really get messy. I was hoping
    Keary> that there was a better solution. Thanks for any help.

Why is this too difficult?  You *are* doing some sort of input
validation before you send the data to posgres aren't you?

roland
--
               PGP Key ID: 66 BC 3B CD
Roland B. Roberts, PhD                             RL Enterprises
roland@rlenter.com                     76-15 113th Street, Apt 3B
roland@astrofoto.org                       Forest Hills, NY 11375

Re: Inserting Null Value or String Value

От
Eckhard Hoeffner
Дата:
* Keary Suska <hierophant@pcisys.net> [01 10 02 19:37]:

>on 10/1/02 10:54 AM, dcmkx10@yahoo.com purportedly said:
>
>I am trying to insert a date into a date field, but also sometimes I need to
>insert a null value.  Inserting the null value seems to require not using
>quotes around null, but if I try to enter a date without quotes around it,
>it thinks it is a number.
>
>Here is the error I get: Warning: PostgreSQL query failed: ERROR: column
>"spec_start_date" is of type 'date' but expression is of type 'integer' You
>will need to rewrite or cast the expression
>
>If I surround the date with single quotes it should be fine, but I can't do
>that when I want to insert a null value.  I know that I can do an "IF <use
>quotes> ELSE <don't use quotes>" in the SQL string, by I am entering many
>values and this would really get messy. I was hoping that there was a better
>solution. Thanks for any help.
>
>If there is a way, I haven't found it yet. But it doesn't have to be
>messy--simply create a function that does the if-else for you, and your code
>will stay clean.

Maybe you should do the following. At the point where the switch
"date" or "NULL" in the php-file is:

if(empty($form_date)){
  $date_var = NULL;
}else $date_var = "'$date'";

$query = "INSERT INTO table (table_row1, date)
          VALUES ('$value1', $date_var);";

You still have the if/else, but I think there must be somewhere the
switch NULL <=> date

--
Eckhard Höffner
e-hoeffner@fifoost.org
D-80331 München
Tel. +49-89-21 03 18 88

Re: Inserting Null Value or String Value

От
"Papp Gyozo"
Дата:
Hi Sean,

see below!

2002. október 1. 18:54 dátummal test test ezt írta:
| Hi,
|
| I am trying to insert a date into a date field, but also sometimes I
| need to insert a null value.  Inserting the null value seems to
| require not using quotes around null, but if I try to enter a date
| without quotes around it, it thinks it is a number.
|
| Here is the error I get: Warning: PostgreSQL query failed: ERROR:
| column "spec_start_date" is of type 'date' but expression is of type
| 'integer' You will need to rewrite or cast the expression
|
| The value I am sending is: spec_start_date = 10/01/02
|
| If I surround the date with single quotes it should be fine, but I
| can't do that when I want to insert a null value.  I know that I can
| do an "IF <use quotes> ELSE <don't use quotes>" in the SQL string, by
| I am entering many values and this would really get messy. I was
| hoping that there was a better solution. Thanks for any help.
|
| Sean
|

Beware crude hack is coming!!!

I wrote a fairly plain function which does the dirty quoting to any
kind of values to be inserted. It looks like:


function quote($var, $type, $empty_null = TRUE)
{
  if ( empty($var) && $empty_null ){
    return 'NULL';
  }
  // if type is prepended with _ it means "array of ..."
  if ( $type{0} == '_' ){
    $type = substr($type, 1);
    $temp = "'{";
    foreach ( $var as $item ){
      $temp .= quote($item, $type).','; // recursive call
    }
    $temp = substr($temp, 0, -1);
    return $temp ."}'";
  }
  switch ( $type ){
  case 'int':
    return intval($var);
  case 'bool':
    return ($var ? "'t'::bool": "'f'::bool");
  case 'date':
    if ( is_numeric($var) ) { // treats as timestamp integer
      return date("'Y-m-d'", $var);
    }
  // otherwise as a date string
  case 'text':
    if (!get_magic_quotes_gpc()) {
      $var = addslashes($var);
    }
    return '\''.$var.'\'';
  default: trigger_error("unknown type : $type ($value)", E_USER_ERROR);
  }
}

You must notice that $var holds the corresponding value to be inserted
or not set (in this case the function returns with NULL), $type is
neither a legal type from PHP nor from Postgresql, but I think you can
figure out how it works.

In my app, I have a PHP array which keeps information about what fields
needs to be inserted and what type these fields have.


$PROPERTIES = array (
'seatnum'     => 'int',
'myear'       => 'int',
'kmage'       => 'int',
'price'       => 'int',
'volume'      => 'int',
'power'       => 'int',
'pprpm'       => 'int',
'color'       => 'text',
'damaged'     => 'bool',
'condition'   => 'int',
'ownernum'    => 'int',
'regvalid'    => 'text',
'cylindernum' => 'int',
'cylinderarr' => 'int',
'gearnum'     => 'int',
'gearing'     => 'int',
'autoclutch'  => 'bool',
'truss'       => 'int',
'trussmaterial' => 'int',
'frontbreak'    => 'int',
'rarebreak'   => 'int',
'accessories' => '_int',
'notes'       => 'text'
);

finally I have to loop through this array  and simply calls quote to
quote the posted variables.

hth,
--
Papp, Győző
- pgerzson@freestart.hu

Re: Inserting Null Value or String Value

От
Sean
Дата:

Actually, this does not work, it generates the SQL fine, but I get a Parse error when trying to insert it. I am doing something very similar, did I mess up somewhere.

Here is the PHP:

if ($special_start_date == '')
{$special_start_date = 'null';}
else {$special_start_date = "'$special_start_date'";}

if ($special_end_date == '')
{$special_end_date = 'null';}
else {$special_end_date = "'$special_end_date'";}

$sql = "INSERT INTO prod_opt (
   xref_prod_id,
   code,
   title,
   isbn,
   list_price,
   our_price,
   spec_price,
   spec_start_date,
   spec_end_date,
   quantity,
   clearance,
   priority)
  VALUES (
   '".$prod_id."',
   '".$item_code."',
   '".$option_format."',
   '".$isbn."',
   ".$list_price.",
   ".$our_price.",
   ".$special_price.",
   ".$special_start_date.",
   ".$special_end_date.",
   ".$qty.",
   '".$clearance."',
   ".$priority.")";
$result = pg_exec($dbh, $sql);

This is the error I get: Warning: PostgreSQL query failed: ERROR: parser: parse error at or near "10"

This is the SQL generated: UPDATE prod_opt SET xref_prod_id = '4', code = '2', title = 'test', isbn = '2', list_price = 2, our_price = 2, spec_price = 2, spec_start_date = '10/01/02', spec_end_date = '10/01/02', quantity = 2, clearance = 't', priority = 2 WHERE id = '2'

-Sean

 Eckhard Hoeffner wrote:

* Keary Suska [01 10 02 19:37]:

>on 10/1/02 10:54 AM, dcmkx10@yahoo.com purportedly said:
>
>I am trying to insert a date into a date field, but also sometimes I need to
>insert a null value. Inserting the null value seems to require not using
>quotes around null, but if I try to enter a date without quotes around it,
>it thinks it is a number.
>
>Here is the error I get: Warning: PostgreSQL query failed: ERROR: column
>"spec_start_date" is of type 'date' but expression is of type 'integer' You
>will need to rewrite or cast the expression
>
>If I surround the date with single quotes it should be fine, but I can't do
>that when I want to insert a null value. I know that I can do an "IF >quotes> ELSE " in the SQL string, by I am entering many
>values and this would really get messy. I was hoping that there was a better
>solution. Thanks for any help.
>
>If there is a way, I haven't found it yet. But it doesn't have to be
>messy--simply create a function that does the if-else for you, and your code
>will stay clean.

Maybe you should do the following. At the point where the switch
"date" or "NULL" in the php-file is:

if(empty($form_date)){
$date_var = NULL;
}else $date_var = "'$date'";

$query = "INSERT INTO table (table_row1, date)
VALUES ('$value1', $date_var);";

You still have the if/else, but I think there must be somewhere the
switch NULL <=> date

--
Eckhard H�ffner
e-hoeffner@fifoost.org
D-80331 M�nchen
Tel. +49-89-21 03 18 88

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org



Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!

Re: Inserting Null Value or String Value

От
Sean
Дата:

Sorry, I pasted the wrong code. This is the PHP Code for the UPDATE not INSERT:

$sql = "UPDATE prod_opt
  SET xref_prod_id = '$prod_id',
   code = '$item_code',
   title = '$option_format',
   isbn = '$isbn',
   list_price = $list_price,
   our_price = $our_price,
   spec_price = $special_price,
   spec_start_date = $special_start_date,
   spec_end_date = $special_end_date,
   quantity = $qty,
   clearance = '$clearance',
   priority = $priority
  WHERE id = '$id'";
$result = pg_exec($dbh, $sql);

 Sean wrote:

Actually, this does not work, it generates the SQL fine, but I get a Parse error when trying to insert it. I am doing something very similar, did I mess up somewhere.

Here is the PHP:

if ($special_start_date == '')
{$special_start_date = 'null';}
else {$special_start_date = "'$special_start_date'";}

if ($special_end_date == '')
{$special_end_date = 'null';}
else {$special_end_date = "'$special_end_date'";}

$sql = "INSERT INTO prod_opt (
   xref_prod_id,
   code,
   title,
   isbn,
   list_price,
   our_price,
   spec_price,
   spec_start_date,
   spec_end_date,
   quantity,
   clearance,
   priority)
  VALUES (
   '".$prod_id."',
   '".$item_code."',
   '".$option_format."',
   '".$isbn."',
   ".$list_price.",
   ".$our_price.",
   ".$special_price.",
   ".$special_start_date.",
   ".$special_end_date.",
   ".$qty.",
   '".$clearance."',
   ".$priority.")";
$result = pg_exec($dbh, $sql);

This is the error I get: Warning: PostgreSQL query failed: ERROR: parser: parse error at or near "10"

This is the SQL generated: UPDATE prod_opt SET xref_prod_id = '4', code = '2', title = 'test', isbn = '2', list_price = 2, our_price = 2, spec_price = 2, spec_start_date = '10/01/02', spec_end_date = '10/01/02', quantity = 2, clearance = 't', priority = 2 WHERE id = '2'

-Sean

 Eckhard Hoeffner wrote:

* Keary Suska [01 10 02 19:37]:

>on 10/1/02 10:54 AM, dcmkx10@yahoo.com purportedly said:
>
>I am trying to insert a date into a date field, but also sometimes I need to
>insert a null value. Inserting the null value seems to require not using
>quotes around null, but if I try to enter a date without quotes around it,
>it thinks it is a number.
>
>Here is the error I get: Warning: PostgreSQL query failed: ERROR: column
>"spec_start_date" is of type 'date' but expression is of type 'integer' You
>will need to rewrite or cast the expression
>
>If I surround the date with single quotes it should be fine, but I can't do
>that when I want to insert a null value. I know that I can do an "IF >quotes> ELSE " in the SQL string, by I am entering many
>values and this would really get messy. I was hoping that there was a better
>solution. Thanks for any help.
>
>If there is a way, I haven't found it yet. But it doesn't have to be
>messy--simply create a function that does the if-else for you, and your code
>will stay clean.

Maybe you should do the following. At the point where the switch
"date" or "NULL" in the php-file is:

if(empty($form_date)){
$date_var = NULL;
}else $date_var = "'$date'";

$query = "INSERT INTO table (table_row1, date)
VALUES ('$value1', $date_var);";

You still have the if/else, but I think there must be somewhere the
switch NULL <=> date

--
Eckhard H�ffner
e-hoeffner@fifoost.org
D-80331 M�nchen
Tel. +49-89-21 03 18 88

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org



Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!



Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!

Re: Inserting Null Value or String Value

От
Keary Suska
Дата:
on 10/1/02 1:20 PM, dcmkx10@yahoo.com purportedly said:

> This is the SQL generated: UPDATE prod_opt SET xref_prod_id = '4', code = '2',
> title = 'test', isbn = '2', list_price = 2, our_price = 2, spec_price = 2,
> spec_start_date = '10/01/02', spec_end_date = '10/01/02', quantity = 2,
> clearance = 't', priority = 2 WHERE id = '2'
>
> This is the error I get: Warning: PostgreSQL query failed: ERROR: parser:
> parse error at or near "10"

I wouldn't expect that error message, but unless you have changed your date
preferences the date format being used is invalid. By default, you must use
SQl formatted dates, e.g. 2002-10-01

Keary Suska
Esoteritech, Inc.
"Leveraging Open Source for a better Internet"