2012-04-19 1 views
1

У меня есть эта часть кода на PHP и с использованием PostgreSQL в качестве базы данных. Я получаю все параметры от GET. Проверьте их, распечатав. Образованный запрос выполняется на терминале Postgres, но с PHP-скриптом не выполняется.обновление запроса php postgres без причины

Вот фрагмент кода.

<?php 

$link = pg_connect("host=localhost dbname=postgres user=postgres password=password") or die('connection failed'); 

# Building the query 
$newq=sprintf("update purchase_info set ....... comments=%s where id=%s",......,$comm,$id); 

    print $newq; // This query runs on the postgres terminal 
    $query=addslashes($newq); // to escape "" as one of my fields is comments 
    $result=pg_query($link,$newq); 

    if (!$result) { 
     echo "An error occured.\n"; 
    } 
    pg_close($link); 
?> 

Другие запросы выполняются в том же скрипте. Эта инструкция SQL содержит около 14 полей.

Что происходит неправильно. Цените помощь!

+0

Ничего не получается «без причины». – Brad

ответ

5

Вы не должны использовать addslashes процитировать строки для PostgreSQL, вы должны использовать pg_escape_literal:

pg_escape_literal() экранирует литерал для запроса базы данных PostgreSQL. Он возвращает безымянный литерал в формате PostgreSQL. pg_escape_literal() добавляет кавычки до и после данных. Рекомендуется использовать эту функцию вместо pg_escape_string().

Вы никогда не должны использовать addslashes для цитирования строк для базы данных:

Настоятельно рекомендуется использовать СУБД определенную функцию эвакуации (например, mysqli_real_escape_string() для MySQL или pg_escape_string() для PostgreSQL)

You следует делать следующее:

$newq = sprintf("update purchase_info set ... comments=%s where id=%d", ..., pg_escape_literal($comm), $id); 

Я предполагаю, что id на самом деле тоже номер.

+0

-У меня это получилось. Большое спасибо! –

+0

@HiteshDharmadasani: Я также рекомендую вам заглянуть в подготовленные заявления, заполнители и PDO, чтобы вам не приходилось гадать, цитируя вещи сами. –

+1

pg_escape_literal() пока не доступен ни в одной выпущенной версии php (в настоящее время последняя версия 5.0.0). Это будет проблемой для большинства людей! –

4

Предполагая, что вы действительно хотите, чтобы ввести параметры в запрос SQL, правильный код будет:

$newq=sprintf("update purchase_info set ... comments='%s' where id='%s'", 
    pg_escape_string($comm), pg_escape_string($id)); 
// DO NOT USE to addslashes, it is not correct 
$result=pg_query($link, $newq); 

Обратите внимание на одинарные кавычки, окружающие% s в строке формата. Кроме того, если идентификатор является целым числом, то лучше сделать использование% D (без кавычек) вместо «% S»

+0

Вся безопасность отдельно. будет строить мой sql-запрос вроде этого $ newq = "update purchase_info set ... comments = '". $ Comm. "' Где id = '". $ Id. "'"; работа тоже? –

+1

Вы почти наверняка не должны указывать «id», PostgreSQL хочет, чтобы числа были числами. –

+1

На самом деле PostgreSQL рассматривает литералы в одинарных кавычках как имеющие тип «неизвестно», пока не будет вынужден его разрешить. В отсутствие другой информации он будет разрешать текст, но вы можете в целом использовать одиночные кавычки в присвоениях * любого * типа. Это делается для того, чтобы пользовательские типы данных, такие как глобальные координаты, могли рассматриваться как объекты первого класса со значениями, назначенными из литералов, без необходимости явно бросать литералы. – kgrittn