Array
(
)

Problema ao usar variáveis SQL Server no PDO

Samuel Lopes
|
MVP
Pontos: 25
    04 ago 2015

Quando tento executar qualquer tipo de sentença do SQL Server usando Variável no PDO não retorna nenhum dado.
public function getPercentualBolsa() {
$sql = "DECLARE @CODCOLIGADA INT , @IDPERLET INT , @RA VARCHAR(30) , @CONTCONTRATO INT
SELECT @CONTCONTRATO = COUNT(*),@CODCOLIGADA = C.CODCOLIGADA , @IDPERLET = C.IDPERLET , @RA = C.RA FROM CORPORERM.DBO.SCONTRATO C
INNER JOIN CORPORERM.DBO.SALUNO A ON A.CODCOLIGADA = C.CODCOLIGADA AND A.RA = C.RA
INNER JOIN CORPORERM.DBO.PPESSOA PP ON PP.CODIGO = A.CODPESSOA
INNER JOIN CORPORERM.DBO.SPLETIVO PL ON PL.CODCOLIGADA = C.CODCOLIGADA AND PL.IDPERLET = C.IDPERLET
WHERE PP.CODUSUARIO = '0001789' AND PL.CODPERLET = '2015/2' AND ISNULL(C.STATUS,'') <> 'S'
GROUP BY C.CODCOLIGADA,C.IDPERLET,C.RA
IF
@CONTCONTRATO > 0
BEGIN
SELECT B.NOME,C.DESCONTO,CASE WHEN COUNT(*) > 0 THEN 'SIM' ELSE 'NAO' END BOLSISTA FROM CORPORERM.DBO.SBOLSAALUNO C
INNER JOIN CORPORERM.DBO.SBOLSA B ON B.CODBOLSA = C.CODBOLSA AND B.CODCOLIGADA = C.CODCOLIGADA
WHERE C.RA = @RA AND C.IDPERLET = @IDPERLET AND C.CODCOLIGADA = @CODCOLIGADA
AND C.CODBOLSA IN (2,10)
AND ISNULL(C.ATIVA,'S') = 'S' AND '2015-09-10' BETWEEN C.DTINICIO AND C.DTFIM
GROUP BY B.NOME,C.DESCONTO
END
ELSE
SELECT B.NOME,C.DESCONTO,CASE WHEN COUNT(*) > 0 THEN 'SIM' ELSE 'NAO' END BOLSISTA FROM CORPORERM.DBO.SBOLSAALUNO C
INNER JOIN CORPORERM.DBO.SALUNO A ON A.CODCOLIGADA = C.CODCOLIGADA AND A.RA = C.RA
INNER JOIN CORPORERM.DBO.SPLETIVO PL ON PL.CODCOLIGADA = C.CODCOLIGADA AND PL.IDPERLET = C.IDPERLET
INNER JOIN CORPORERM.DBO.SBOLSA B ON B.CODBOLSA = C.CODBOLSA AND B.CODCOLIGADA = C.CODCOLIGADA
WHERE C.RA = @RA AND C.CODCOLIGADA = @CODCOLIGADA AND PL.CODPERLET = '2015/1'
AND C.CODBOLSA IN (2,10)
AND ISNULL(C.ATIVA,'S') = 'S'
GROUP BY B.NOME,C.DESCONTO
";
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt;
}
já tentei retirar o prepare usando apenas
$stmt = $sql, mas mesmo assim não funciona.

William (devwilliam)
   - 04 ago 2015

Samuel por gentileza utilize a tag CODE para postar trechos de códigos!

Quanto ao seu código não vi você chamando o "fetch" dos dados, exemplo:

#Código

$dados = $stm->fetchAll(PDO::FETCH_OBJ);

Samuel Lopes
|
MVP
Pontos: 25
    05 ago 2015

estou utilizando assim

#Código

$conexao = new conexao('bd');
$db = $conexao->connect();

$codusuario = $_GET['codusuario'];

$model = new modelAdaptacaoDependencia($db);
$stmt = $model->getPercentualBolsa();

$rw = $stmt->fetchObject();

print $rw->NOME;

William (devwilliam)
   - 06 ago 2015

Samuel, uma sugestão seria criar uma procedure no SQL Server com essas instruções e depois só chamar com PDO.

William (devwilliam)
   - 06 ago 2015

Samuel, uma sugestão seria criar uma procedure no SQL Server com essas instruções e depois só chamar com PDO.

Samuel Lopes
|
MVP
Pontos: 25
    26 nov 2015

Mesmo usando procedure não funciona

Sentença na procedure

#Código


DECLARE PROCEDURE verificaDtAdmissao

as

DECLARE @DIA_SEMANA INT
SET @DIA_SEMANA = (DATEPART(DW,DATEADD(day, 2, getdate())))
SELECT @DIA_SEMANA AS DIAS
 


Código PHP

#Código
 public function retornaDiasData($data) {
        $sql = "EXEC verificaDtAdmissao";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(":data", $data, PDO::PARAM_STR);
        $stmt->execute();
        $rw = $stmt->fetchObject();
        return $rw->DIAS;
    }


Mesmo assim não me retorna nada

Agora seu eu utilizar assim

#Código
 public function retornaDiasData($data) {
        $sql = "SELECT (DATEPART(DW,DATEADD(day, 2, getdate()))) AS DIAS";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(":data", $data, PDO::PARAM_STR);
        $stmt->execute();
        $rw = $stmt->fetchObject();
        return $rw->DIAS;
    }


Desta forma funciona. Veja que passei a sentença sem variável. Gostaria de entender porque isto acontece, porque não aceita variáveis nas sentenças com PDO. Se utilizar um mssql_query ao invés de PDO a variável funciona. Pode ser algo relacionado a segurança, mas tem uma boa prática para funcionar?

William (devwilliam)
   - 26 nov 2015

Dá uma olhada nessas vídeos que gravei sobre PDO, entre elas tem uma para executar Procedures e Functions no MySQL:
http://www.devwilliam.com.br/php/curso-php-com-pdo-videos