Процедура синтаксического сбоя, проверенная оператором PDO (SQL Server) - PullRequest
0 голосов
/ 22 февраля 2019

У меня следующая ошибка:

PDOStatement :: execute (): SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 102 [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQLСервер] Неверный синтаксис рядом с @IdIng.в C: \ Apache24 \ localhost \ Class \ IngredientsManager.php в строке 64

мой связанный метод в классе IngredientsManager.php:

public function deleted(Ingredient $ingredient)
    {
        $db = parent::dbConnect();
        $stmt = $db->prepare("CALL DeleteIngredient( @IdIng=:code)");
        $code='['.$ingredient->code().']';
        $stmt->bindParam(':code', $code);
        $stmt->execute();
    }

Я также попытался:

public function deleted(Ingredient $ingredient)
        {
            $db = parent::dbConnect();
            $stmt = $db->prepare("CALL DeleteIngredient(?)");
            $code='['.$ingredient->code().']';
            $stmt->bindParam(1, $code, PDO::PARAM_STR);
            $stmt->execute();
        }

мой связанный метод из моего компонента класса:

public function __construct(array $data)
    {
    $this->hydrate($data);
    }

    public function hydrate(array $data)
    {
        $keys = array_keys($data);
        if (array_key_exists(0, $keys)) {
            $this->setCode($data[$keys[0]]);
            $this->setCodealias($keys[0]);
        }
        if (array_key_exists(1, $keys)) {
            $this->setName($data[$keys[1]]);
            $this->setNamealias($keys[1]);
        }
        if (array_key_exists(2, $keys)) {
        $this->setSupplier($data[$keys[2]]);
        $this->setSupplieralias($keys[2]);
        }
        if (array_key_exists(2, $keys)) {
        $this->setEditdate($data[$keys[3]]);
        $this->setEditdatealias($keys[3]);
        }
    }

связанный код в контроллере:

case "deleteIgr":
        require("Class/Ingredient.php");
        require("Class/IngredientsManager.php");
        $data = array ('code'=> $_POST['code']);
        $deleterIngredient = new IngredientsManager;
        $deletedIngredient=$deleterIngredient->deleted(new Ingredient($data));
        echo 'ok';

Я уточняю, что мой $ _POST ['code'] приходит от AJAX и он в коде значения, когда я делаю цветной журнал, и этозначения проходят, я не знаю, откуда взялась эта синтаксическая ошибка.Я впервые использую хранимую процедуру.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете попытаться выполнить вашу хранимую процедуру одним из следующих способов:

$stmt = $db->prepare("{CALL DeleteIngredient(?)}");
$code = $ingredient->code();
$stmt->bindParam(1, $code);
$stmt->execute();

$stmt = $db->prepare("{CALL DeleteIngredient(:code)}");
$code = $ingredient->code();
$stmt->bindParam(':code', $code);
$stmt->execute();

$stmt = $db->prepare("EXEC DeleteIngredient @IdIng = :code");
$code = $ingredient->code();
$stmt->bindParam(':code', $code);
$stmt->execute();

Я могу воспроизвести эту ошибку с помощью драйвера PHP для SQL Server, и причина заключается в отсутствии {} вокруг CALL DeleteIngredient(?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...