A instrução preparada pg_prepare () (não PDO) impede a injeção de SQL?

O PDO não é suportado no sistema de destino em que estou trabalhando e embora eu busque uma solução para prevenir Injeção de SQL usandoPHP 5.1.x com umPostGres-DB 8.2+. Existe no momentonão chance de mudar para o PDO.

Minha solução no momento é a declaração preparada pelo pg_prepare:

// Trying to prevent SQL-Injection
$query = 'SELECT * FROM user WHERE login=$1 and password=md5($2)';
$result = pg_prepare($dbconn, "", $query);
$result = pg_execute($dbconn, "", array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die ("failure");
}

Mas pg_prepare-documentation não tem uma informação importante:

fala sobre "uso posterior"

pg_prepare () cria uma declaração preparada para execução posterior com pg_execute () ou pg_send_execute (). [...]

fala sobre "declarações nomeadas / anônimas"

A função cria uma instrução preparada denominada stmtname da cadeia de consulta, que deve conter um único comando SQL. stmtname pode ser "" para criar uma declaração sem nome, caso em que qualquer declaração anônima preexistente é automaticamente [...]

fala sobre "typecasting"

As instruções preparadas para uso com pg_prepare () também podem ser criadas executando-se instruções SQL PREPARE. (Mas o pg_prepare () é mais flexível, pois não requer que os tipos de parâmetros sejam pré-especificados.) Além disso, embora não exista nenhuma função PHP para excluir uma instrução preparada, a instrução SQL DEALLOCATE pode ser usada para essa finalidade.

mas não diz, se esta implementação de instruções preparadas é segura de injeção de SQL

* Quase todos os comentários desta pergunta de segurança referem-se à solução PDO, onde na documentação é notado que o driver impede a injeção de SQL. Mas se uma solução fácil pode ser pg_prepare, eu usaria pg_prepare no momento. *

Obrigado por esta informação importante de talvez uma solução de melhores práticas.

EDITAR (depois de marcado como solução): Obrigado por respostas muito esclarecedoras!

Eu marquei a solução de Frank Heikens como melhor resposta, porque explica um ponto importante na injeção de SQL. Um programador pode usar statemtents preparados, mas a falta de injeção de SQL ainda pode estar lá por engano!Além da resposta de Frank Heikens, o hoppa mostra que a injeção de SQL é impedida usando pg_prepare / pg_query_params. Obrigado embora.Agora usará um código otimizado compg_query_params (graças a Milen A. Radev)Epg_escape_string() como alternativa quando se trata disso (graças ao halfer)

Todas as respostas são úteis :)

// Trying to prevent SQL-Injection (**updated**)
$sql_query = 'SELECT * FROM user WHERE login=$1 and password=md5($2);';
$result = pg_query_params($dbconn_login, $sql_query, array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die('failure');
}

questionAnswers(4)

yourAnswerToTheQuestion