如果 eval() 是答案,那么你几乎肯定问错了问题。
(PHP 4, PHP 5, PHP 7, PHP 8)
odbc_exec — 直接执行 SQL 语句
如果 SQL 命令成功执行,则返回 ODBC 结果标识符,否则在错误时返回 false
。
版本 | 说明 |
---|---|
8.0.0 |
flags 已被移除。 |
大家好,我设法让这段代码片段运行起来,如果你要插入到数据库中的表单很长,它会非常有用。
if ( ! empty ( $_POST ) ){
array_pop($_POST);
foreach($_POST as $key => $val){
$columns .= addslashes($key) . ", ";
$values .= "'" . addslashes($val) . "', ";
}
$values = substr_replace($values, "", -2);
$columns = substr_replace($columns, "", -2);
$sql = "INSERT INTO table ($columns) VALUES ($values)";
echo $sql;
$results = odbc_exec($conn, $sql);
if ($results){
echo "Query Executed";
}else {
echo "Query failed " .odbc_error();
}
}
这在世界上并不算最安全的,但它加快了从大型表单中收集数据的速度。
如果你正在运行 NT/IIS 与 PHP 3.0.11 并且想要使用带 "存储过程" 的 MS Access 数据库,你可以发送类似于以下的 ODBC SQL 查询
<?php
$conn_id = odbc_connect( "odbc_test_db", "", "", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery}" );
?>
这样你就无需在 PHP 文件中整合查询字符串,例如
SELECT * FROM TblObject WHERE (((TblObject.something) Like "blahblahblah"));
你可以直接调用由 MS Access 生成的查询 "MyQuery"。
对于 Win32(NT) 和 MSAcess 2000,无论你如何在 Access 中指定日期的格式,只要你检索日期列/字段,PHP 都会自动将其转换为 'yyyy/mm/dd hh:mm:ss' 格式。
当执行 SELECT、UPDATE 或 DELETE 查询时,这似乎会导致问题,但奇怪的是 INSERT 却可以正常工作。我尝试将日期解析为所需的格式,但 PHP 仍然报错条件不匹配。
我尝试了以下代码行
<?php
$odbc=odbc_connect("pbk", "root","") or die(odbc_errormsg());
$q="insert into pbk values(\"$name\", \"$phone\")";
print $q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>
它不起作用。但是,如果我使用单引号而不是 \",事情就会顺利运行。
因此,以下内容将起作用
<?php
$odbc=odbc_connect("pbk", "yourworstnightmare","abracadabra") or die(odbc_errormsg());
$q="insert into pbk values('$name', '$phone')";
print $q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>
此外,在 Win2k 上使用用户 DSN 也不好。始终使用系统 DSN。我还不清楚这样做会带来什么影响。
我尝试了这种方法来查看查询的结果,它可以正常工作!
$Conn = odbc_connect
("bbdd_usuaris","","",SQL_CUR_USE_ODBC );
$result=odbc_exec($Conn,"select nom from usuaris;");
while(odbc_fetch_row($result)){
for($i=1;$i<=odbc_num_fields($result);$i++){
echo "Result is ".odbc_result($result,$i);
}
}
如果你在 ODBC 查询中遇到文本字段被截断的问题(例如,在 4096 个字符处),请尝试以下一些方法
在 php.ini 中
- odbc.defaultlrl = 65536
在你的 PHP 代码中,在你的查询之前
- ini_set ( 'odbc.defaultlrl' , '65536' );
以下内容对我来说似乎不直观,所以我总是会被它烧到。我只是想提醒一下其他人,他们可能也会被烧到。
if (!odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))
并不是搜索 Key1 = x 且 Key2 = y 的记录是否存在的好方法。odbc_exec 始终返回结果句柄,即使没有记录。
相反,你必须使用其中一个获取函数来确定记录确实不存在。这应该可以正常工作
if (!($Selhand = odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))
|| !odbc_result($Selhand, 1))
如果你的 WHERE 语句指定的字段中存在单引号,则 ODBC 会由于解析错误而失败。虽然看起来很直观,但在字段周围使用 \" 并不能解决问题("$var")。我发现的唯一解决方案是在我的字段中用两个单引号替换所有单引号。ODBC 将第一个单引号解释为转义字符,并将第二个单引号解释为字面量。感谢 http://www.devguru.com/features/knowledge_base/A100206.html 提供了这个技巧。
在之前的贡献中,有人说如果你正在运行 NT/IIS 与 PHP 3.0.11,则可以使用 MS Access 数据库的 "存储过程"。
那是正确的,但如果这些存储过程有参数,你必须在命令行中提供它们,如下所示
$conn_id = odbc_connect( "odbc_test_db", "","", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery(".$param.")}" );
作为对之前关于方括号的注释的补充
在 SQL 字段名称周围加上 '[' 和 ']',也可以在你的 SQL 查询中使用 MS Access 保留字,例如 'date'、'field' 和 'time' ... 似乎方括号只是告诉 Access 忽略任何其他含义,无论其中的内容是什么,并将它们简单地视为字段名称。
问题:SQL 语句中的字段名称包含空格,[] 不起作用!
解决方案:尝试 ""
例如。
SELECT table2.first, table1.[last name] FROM tabel1, table2 -> 不起作用
SELECT table2.first, table1.\"last name\" FROM tabel1, table2 -> 试试这个
PS: 不要忘记空格字符!!!
ODBC/MS Access 日期字段
在 MS Access 的 SELECT 语句中匹配日期需要以下格式
#Y-m-d H:i:s#
例如
SELECT * FROM TableName WHERE Birthdate = #2001-01-07 00:00:00#
或者
SELECT * FROM TableName WHERE Birthdate BETWEEN #2000-01-07 00:00:00# AND #2001-01-07 00:00:00#
我花了好长时间才搞清楚。
有关 ODBC_exec 的其他链接
如何实际编写 SQL 命令
http://www.roth.net/perl/odbc/faq/
http://www.netaxs.com/~joc/perl/article/SQL.html
揭开 SQL 的神秘面纱
大型参考手册
http://w3.one.net/~jhoffman/sqltut.htm
结构化查询语言简介
涵盖数据读取、添加、修改和删除。
很容易将恶意代码注入 SQL 语句。这将参数括在引号中,以防止它们被执行。在您自己的存储过程中,您可以根据需要将字符串转换为数字。
function sql_make_string($sin){
return "'".str_replace("'","''",$sin)."'";
}
// 这可能会从 MYTABLE 中删除所有数据
$evil = "734'; DELETE FROM MYTABLE; print 'ha ha";
$sql = "SELECT * FROM MYTABLE WHERE mykey = '$evil'";
$rst = odbc_exec($connection,$sql);
// 这可能不会删除数据。
$good = sql_make_string($evil);
$sql = "SELECT * FROM MYTABLE WHERE mykey =".$good
$rst = odbc_exec($connection,$sql);
这在 db2 中默认打开“供更新”的 select 语句。如果您使用的是 db2,则必须在末尾添加“供只读”才能从 SYSCAT.TABLES 中选择,例如,而不会引发类似以下的错误
Warning: SQL error: [IBM][CLI Driver][DB2/LINUX] SQL0151N 无法更新列“MAXFREESPACESEARCH”。SQLSTATE=42808,SQL 状态 42808 在 SQLExecDirect 中
例如
$query = odbc_exec($conn, "select * from syscat.tables for read only");
odbc_result_all($query);
将起作用(仅适用于 db2)。我不知道其他数据库是否可以。
select 语句将在“db2”命令行中起作用,但在 php 中不起作用,因为存在这种副作用。
包含引号(即“)而不是撇号(即')来分隔字符串的 SQL 语句在 Access 中可以正常工作,但在 odbc_exec 中,它会失败,并出现以下错误
[Microsoft][ODBC Microsoft Access Driver] 参数太少。预期为 6。
例如
$q = "INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES('A', 'B', 'C');"
在 Access 和 ODBC 中都可以正常工作,但
$q = 'INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES("A", "B", "C");'
会因上述错误而失败。
<?php
// - 这是一个完整的动态示例,演示了如何使用:
// odbc_connect、odbc_exec、获取列名、
// odbc_fetch_row 和行数。希望对您有所帮助
// - 您的驱动程序应指向您的 MS Access 文件
$conn = odbc_connect('MSAccessDriver','','');
$nrows=0;
if ($conn)
{
$sql = "select * from $month";
// 此函数将执行 sql 语句
$result=odbc_exec($conn, $sql);
echo "<table align=\"center\" border=\"1\" borderColor=\"\" cellpadding=\"0\" cellspacing=\"0\">\n";
echo "<tr> ";
// -- 打印字段名
$colName = odbc_num_fields($result);
for ($j=1; $j<= $colName; $j++)
{
echo "<th align=\"left\" bgcolor=\"#CCCCCC\" > <font color=\"#990000\"> ";
echo odbc_field_name ($result, $j );
echo "</font> </th>";
}
$j=$j-1;
$c=0;
// 字段名结束
while(odbc_fetch_row($result)) // 获取数据
{
$c=$c+1;
if ( $c%2 == 0 )
echo "<tr bgcolor=\"#d0d0d0\" >\n";
else
echo "<tr bgcolor=\"#eeeeee\">\n";
for($i=1;$i<=odbc_num_fields($result);$i++)
{
echo "<td>";
echo odbc_result($result,$i);
echo "</td>";
if ( $i%$j == 0 )
{
$nrows+=1; // 统计行数
}
}
echo "</tr>";
}
echo "</td> </tr>\n";
echo "</table >\n";
// -- 表格结束
if ($nrows==0) echo "<br/><center> $month 还没有内容!请稍后再试</center> <br/>";
else echo "<br/><center> 总记录数: $nrows </center> <br/>";
odbc_close ($conn);
}
else echo "odbc 未连接 <br>";
?>
如果 Openlink -> MS Access 数据库失败并显示“驱动程序不可用”错误或“无元组可用”警告,请在使用 odbc_connect() 时使用 SQL_CUR_USE_ODBC 游标...
Siggy
"[Microsoft][ODBC Microsoft Access Driver] 参数太少
预期为 1."
此不太容易理解的错误在使用 access-odbc 时出现,并且找不到字段名。请检查字段名称拼写是否正确。
我想通过 ODBC 访问 MSAccess 数据库。连接没有问题,但当我将 SQL 语句放入我的 odbc_exec() 时,我总是会收到错误
Warning: SQL error: [Microsoft][ODBC Driver Manager] 驱动程序不支持该功能,SQL 状态 IM001 在 \\Server\directory/test.php3 第 19 行的 SQLSetStmtOption 中。
我自己解决了问题:我只需要从微软主页安装一个新的 odbc 驱动程序。