【发布时间】:2018-01-03 03:10:10
【问题描述】:
我正在尝试执行 SQL 查询,但它不起作用。
$sql = "SELECT top 5 AccountDocument from web.Preoffers_new where AccountDocument = 'xxxxxxxx'";
$stmt = $db->prepare($sql);
$stmt->execute();
if ($data = $stmt->fetch()) {
do {
echo $data['AccountDocument'] . '<br>';
} while ($data = $stmt->fetch());
} else {
echo 'Empty Query';
}
这完美地工作并向我展示了结果。
但是这个:
$sql = "SELECT top 5 Document from Companies where Document = 'xxxxxxxx'";
$stmt = $db->prepare($sql);
$stmt->execute();
if ($data = $stmt->fetch()) {
do {
echo $data['Document'] . '<br>';
} while ($data = $stmt->fetch());
} else {
echo 'Empty Query';
}
直接转到空查询。但事实并非如此,因为如果我在 SQL 中执行该查询,它会完美运行。
我看到的唯一不同是第一个查询转到数据库中的表,第二个查询转到一个视图...
一些线索可能是这样的?
SET
ANSI_NULLS,
QUOTED_IDENTIFIER,
CONCAT_NULL_YIELDS_NULL,
ANSI_WARNINGS,
ANSI_PADDING
ON;
更新---->
我设置了属性 PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION 以查看服务器是否显示给我一些东西,我收到了这个:
错误 conectando con la base de datos: SQLSTATE[HY000]: General error: 1934 General SQL Server error: Check messages from the SQL Server [1934] (severity 16) [SELECT top 5 Document from Companies where Document = 'xxxxxxxx']
我检查了 SQL 中的错误,我得到了这个:
%ls 失败,因为以下 SET 选项的设置不正确:'%.*ls'。验证 SET 选项是否适用于 %S_MSG..
有人知道为什么我不能在视图中进行查询吗?
感谢您阅读我:)
【问题讨论】:
-
您的
document = "whatever"变量吗?证件号码有变化吗?如果是,你应该看看bobby-tables.com 如何正确使用准备好的语句,因为现在它们在你的代码中完全没用。您可以通过简单的查询来做到这一点,无需准备它们。另外,你能告诉我们你的表结构吗? -
我不明白你的问题。该查询将数据存储在一个数组中,然后显示它。它适用于其中一个代码,但另一个不适用,唯一的区别是一个指向数据库中的表,另一个指向数据库中的视图。
-
其实我并没有试图回答你的问题,我只是想让你的代码更安全。我只是问这个
xxxxxxxxx文档编号是否会在你的代码中被硬编码,或者它是否会被一个变量替换,比如Document = $DocumentID- 如果是这样,你实际上应该使用准备好的语句。如果没有,则无需使用它们。 -
现在是一个数字,但当然如果我使用这个代码我有机会改变。
-
已解决:错误给了我线索。 .....以下 SET 选项设置不正确...... 错误并没有告诉我什么类型的配置错误。我做了一些测试并放置了以下参数,一切正常: $db->exec("SET ANSI_WARNINGS ON"); $db->exec("SET ANSI_PADDING ON"); $db->exec("SET ANSI_NULLS ON"); $db->exec("SET QUOTED_IDENTIFIER ON"); $db->exec("SET CONCAT_NULL_YIELDS_NULL ON");