Фатальная ошибка: Call to member function PrEP () on non-object in


Добрый день, когда я пытаюсь запросить лист в своей форме, я получаю сообщение об ошибке:

фатальная ошибка: вызов функции члена подготовьте () on non-object in

Здесь мой код:

<?php
$serverName = "10.21.22.16"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Siec", "UID"=>"sa", "PWD"=>"k115");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
$result="";
if(array_key_exists("search",$_POST)){
$consul= 'SELECT SOL.FOLIO, SOL.ESTATUSPAG, SV.TOTALP, CS.SERVICIO 
FROM 
SOLICITU SOL
INNER JOIN SERVSOL SV ON SV.FOLIO=SOL.FOLIO
INNER JOIN  CATSERV CS ON CS.SERVS = SV.SERVS
WHERE SOL.FOLIO = ?';
$stmt=$conn->prepare($consul);
$result=$stmt->execute(array($_POST['folio']));
$result=$stmt->fetch();
if(empty($result)){
$result = "No se encontraron resultados!!";
}
}
?>
<html>
<body>
<form action="" method="post">
<div>
<label for="folio">folio: </label>
<input type="text" name="folio" id="folio"/>
<input type="submit" name="search" value="Buscar" />
</div>
</form>
</body>
<?php
if( !empty($result) ) {
?>
<p><strong>folio</strong>: <?php echo $result['folio'];?></p>
<p><strong>Estatus Pagado</strong>: <?php echo $result['Estatuspag'];?></p>
<p><strong>Total</strong>: <?php echo $result['Totalp'];?></p>
<p><strong>Servicio</strong>: <?php echo $result['SERVICIO'];?></p>
<?php
}
?>
</html>

это прямо в этой строке, где я отмечаю ошибку

$stmt=$conn - >PrEP ($consul);

Кто-нибудь знает, почему? Спасибо за ваши ответы

Author: Augustoock, 2017-02-27

2 answers

Похоже, что ваша проблема связана с соединением, вы можете использовать пример из официальной документации и проверить, было ли соединение успешно выполнено

$serverName = "serverName\sqlexpress"; //serverName\instanceName
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
     echo "Conexión establecida.<br />";
}else{
     echo "Conexión no se pudo establecer.<br />";
     die( print_r( sqlsrv_errors(), true));
}
?>

Переменная $conn возвращается FALSE, а не ресурс, поэтому он показывает вам ошибку

Я редактирую:

Ваша ошибка заключается в том, что переменная $conn имеет тип resource нет object

Если мы проверим официальную документацию, для выполнения подготовленного запроса необходимо использовать функцию sqlsrv_prepare()

Суммирование вашего кода происходит следующим образом:

$serverName = "10.21.22.16"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Siec", "UID"=>"sa", "PWD"=>"k115");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
$result="";
if(array_key_exists("search",$_POST))
{
    $consul= "SELECT 
                  SOL.FOLIO, 
                  SOL.ESTATUSPAG, 
                  SV.TOTALP, 
                  CS.SERVICIO 
              FROM 
                  SOLICITU SOL
                  INNER JOIN SERVSOL SV ON SV.FOLIO=SOL.FOLIO
                  INNER JOIN  CATSERV CS ON CS.SERVS = SV.SERVS
              WHERE SOL.FOLIO = ?";

    $stmt = sqlsrv_prepare($conn, $consul, array($_POST['folio']));

    if( !$stmt ) 
    {
        $result = "Error en la consulta";
        //die( print_r( sqlsrv_errors(), true));
    }

    if( sqlsrv_execute( $stmt ) === false ) 
    {
      $result = "No se encontraron resultados!!";
      //die( print_r( sqlsrv_errors(), true));
    }
    else
    {
        $result = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)
    }            

    sqlsrv_free_stmt($stmt);
}

С другой стороны, я рекомендую вам использовать PDO который также поддерживает MS SQL

Использование POO намного проще, и ваш код будет выглядеть примерно так:

$conn = new PDO('sqlsrv:Server=10.21.22.16;Database=Siec','sa','k115');

if(array_key_exists("search",$_POST))
{
    $consul= "SELECT 
                  SOL.FOLIO, 
                  SOL.ESTATUSPAG, 
                  SV.TOTALP, 
                  CS.SERVICIO 
              FROM 
                  SOLICITU SOL
                  INNER JOIN SERVSOL SV ON SV.FOLIO=SOL.FOLIO
                  INNER JOIN  CATSERV CS ON CS.SERVS = SV.SERVS
              WHERE SOL.FOLIO = ?";

    $stmt = $conn->prepare($consul);
    $folio = $_POST['folio'];
    $stmt->bindParam(1, $folio, PDO::PARAM_STR);

    if( !$stmt->execute() ) 
    {
        $result = "Error en la consulta";
    }
    else
    {
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
    }            

}

Вы можете прочитать официальную документацию PDO, чтобы прояснить любые вопросы :)

 2
Author: Bryan Velastegui, 2017-03-03 13:20:41

Ваш оператор никогда не будет работать, потому что вы забыли некоторые важные шаги, один из них, bind_param(), Вот где вы получаете ошибку, вы должны передать параметр вашего WHERE SOL. FOLIO=? , то есть вашу переменную $_POST['folio']

Mysqli_stmt:: bind_param -- mysqli_stmt_bind_param-добавляет переменные в подготовленный оператор в качестве параметров

Указание типа символов
i соответствующая переменная целочисленный тип
d соответствующая переменная имеет тип double
s соответствующая переменная имеет тип string
b соответствующая переменная является blob и отправляется в пакетах

Обновленный Пример:

$consul= 'SELECT SOL.FOLIO, SOL.ESTATUSPAG, SV.TOTALP, CS.SERVICIO 
FROM 
SOLICITU SOL
INNER JOIN SERVSOL SV ON SV.FOLIO=SOL.FOLIO
INNER JOIN  CATSERV CS ON CS.SERVS = SV.SERVS
WHERE SOL.FOLIO = ?';    
$stmt=$conn->prepare($consul);
$stmt->bind_param("Especificación del tipo de caracteres", $tu_variable_folio);
$stmt->execute();
//Transfiere un conjunto de resulados de la última consulta
$stmt->store_result();
//Comprobamos si existen registros en la Base de datos.
if($stmt->num_rows>0){
  //Vincula variables a una sentencia preparada para el almacenamiento de resultados.
  $stmt->bind_result($FOLIO,$ESTATUSPAG,$TOTALP,$SERVICIO);//Lo que has seleccionado en tu SELECT
  $stmt->fetch();
  //Ya puedes trabajar con tus datos desde la Base de datos.
} else {
   echo 'Se encontaron 0 resultados.";
}
$stmt->close();//Cerramos sentencia.

Ваш HTML будет выглядеть так:

<p><strong>folio</strong>: <?php echo $FOLIO;?></p>
<p><strong>Estatus Pagado</strong>: <?php echo $ESTATUSPAG;?></p>
<p><strong>Total</strong>: <?php echo $TOTALP;?></p>
<p><strong>Servicio</strong>: <?php echo $SERVICIO;?></p>

Руководство PHP подготовленные операторы.

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

Пример:

$conn = new mysqli("localhost", "usuario", "contraseña", "basedatos");
 2
Author: Diablo, 2017-02-27 23:54:12