Привязка к параметрам с помощью odbc_exec - PullRequest
0 голосов
/ 24 августа 2018

Я использую базу данных Microsoft Access и подключен к ней через ODBC в своем коде PHP. Я посмотрел онлайн, и в руководстве по PHP написано, что odbc_exec готовит и выполняет оператор.

В моем коде есть параметры, позволяющие избежать внедрения SQL, но я не могу использовать odbc_prepare и odbc_execute, так как они не поддерживаются MS Access. У меня проблемы с поиском, как связать мои переменные с параметрами в моем SQL-выражении.

PHP

<?php

$con=odbc_connect("InventoryDB", "", ""); 

if (isset($_POST['partNumber'])) {
    $partNum = $_POST['partNumber'];
}

if (isset($_POST['manufacturer'])) {
    $manufacturer = $_POST['manufacturer'];
}

if (isset($_POST['supplier'])) {
    $supplier = $_POST['supplier'];
}

if (isset($_POST['catalogNumber'])) {
    $catalogNumber = $_POST['catalogNumber'];
}

if (isset($_POST['deviceFamily'])) {
    $deviceFamily = $_POST['deviceFamily'];
}

if (isset($_POST['listPrice'])) {
    $listPrice = $_POST['listPrice'];
}

if (isset($_POST['quantity'])) {
    $quantity = $_POST['quantity'];
}

if (isset($_POST['packets'])) {
    $packets = $_POST['packets'];
}



$stmt = odbc_prepare($con, 'INSERT INTO Parts (PartNumber, Manufacturer, Supplier, CatalogNumber, DeviceFamily, ListPrice, Quantity, Packets) VALUES (?, ?, ?, ?, ?, ?, ?, ?)'); // Insert all of the values from the form into the table
$rs = odbc_execute($stmt, array($partNum, $manufacturer, $supplier, $catalogNumber, $deviceFamily, $listPrice, $quantity, $packets));

?>

Я хотел бы знать, как сделать то, что я сейчас делаю, с подготовкой и выполнением, используя только odbc_exec.

Все значения взяты из формы для добавления в базу данных, которая показывает инвентаризацию компании.

EDIT

Ошибка при использовании функции prepare и execute возвращает odbc_prepare():

Ошибка SQL: [Microsoft] [Диспетчер драйверов ODBC] Драйвер не поддерживает это функция, состояние SQL IM001 в SQLDescribeParameter

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Рассмотрим обобщенный DB-API PHP, PDO , который среди других RBDMS может подключаться к MS Access через ODBC для параметризованных запросов .Вам может потребоваться включить php_pdo_odbc в файле .ini:

$database = "C:\\path\\to\\mydatabase.accdb";

// WITH DSN
$dbh = new PDO("odbc:DSN=MS Access Database;DBq=$database;");
// WITH DRIVER
// $dbh = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBq=$database;");

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO Parts (PartNumber, Manufacturer, Supplier, CatalogNumber, 
                           DeviceFamily, ListPrice, Quantity, Packets) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)";  

try {
    $sth = $dbh->prepare($sql); 
    $sth->execute(array($partNum, $manufacturer, $supplier, $catalogNumber, 
                        $deviceFamily, $listPrice, $quantity, $packets));
}
catch(PDOException $e) {  
    echo $e->getMessage()."\n";
}

// CLOSE CONNECTION
$dbh = null;
0 голосов
/ 24 августа 2018

Если вы не можете использовать odbc_prepare, вы должны сгенерировать оператор SQL в виде строки и сделать все возможное, чтобы защитить себя от внедрения SQL.Безусловно, самая большая проблема - это символ '.Я использую эти две функции:

function Qs($Text) { return(str_replace("'","''",$Text)); }
function Qsz($Text) { return(empty($Text)?'NULL':("'".Qs($Text)."'")); }

Первая просто позволяет избежать проблем с '.Я использую второй, если я хочу вставить NULL вместо пустой строки (обычно это так).

Используйте двойные кавычки при генерации вашего оператора SQL, чтобы они не конфликтовали с одинарными кавычками внутризаявление.Пример (предполагается, что оба поля являются текстовыми):

$sql = "INSERT INTO Parts (PartNumber, Manufacturer) VALUES (".Qsz($_POST['partNumber']).",".Qsz($_POST['partNumber']).")";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...