我正在使用Microsoft Access数据库,并在我的PHP代码中通过ODBC连接到它。我在网上看过,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
来进行准备和执行操作。
所有值均来自要添加到显示公司库存的数据库的表单。
编辑
使用准备并执行返回的错误为odbc_prepare()
:
SQL错误:[Microsoft] [ODBC驱动程序管理器]驱动程序不支持此 函数,SQLDescribeParameter中的SQL状态IM001
答案 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']).")";