使用odbc_exec绑定到参数

时间:2018-08-24 13:01:23

标签: php sql ms-access

我正在使用Microsoft Access数据库,并在我的PHP代码中通过ODBC连接到它。我在网上看过,PHP手册说odbc_exec准备并执行该语句。

我的代码具有避免SQL注入的参数,但是我不能使用odbc_prepareodbc_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来进行准备和执行操作。

所有值均来自要添加到显示公司库存的数据库的表单。

编辑

使用准备并执行返回的错误为odbc_prepare()

  

SQL错误:[Microsoft] [ODBC驱动程序管理器]驱动程序不支持此   函数,SQLDescribeParameter中的SQL状态IM001

2 个答案:

答案 0 :(得分:1)

考虑PHP的通用DB-API PDO,其中其他RBDMS可以通过ODBC为parameterized queries连接到MS Access。您可能需要在.ini文件中启用php_pdo_odbc

$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;

答案 1 :(得分:-1)

如果不能使用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']).")";