我一直在使用PDO和PHP一段时间使用MySQL和Apache服务器.我最近的任务是将业务的遗留Web应用程序转换为新的设置.旧的设置是标准的Linux Web堆栈(Apache/PHP/MySQL/Filezilla),新的设置将是带有IIS/PHP(快速cgi安装)/ SQL Server 2003 /无FTP的Windows服务器2003.
除了转换MySQL语句以更新具有文件访问信息的表之外,我几乎所有工作都在工作.将PDO与SQLSRV驱动程序一起使用并在"文件下载"PHP脚本中执行insert语句,将多个记录插入SQL表中.
download.php DOES向SQL服务器发出多个查询.一次检查一个表中的文件是否存在和变量,然后THEN用访问信息更新另一个表.
请参阅下面的download.php代码
调试显示$ count的打印/回显为1.但是,检查SQL服务器记录时,始终显示多个已插入.有时它只是一个额外的行,总共两个,但有时它插入的高达四个EXTRA语句.在每种情况下,$ count仍显示为1.
此特定PHP脚本在调用此insert语句之前验证SQL数据库的信息.首先,验证文件访问的验证(成功),验证文件是否存在(成功),然后用下载信息(ERROR)更新访问表,最后将PDF提供给用户(成功).
当我手动向查询分析器发出INSERT语句时,它成功并按预期工作; 它每次都插入一行.该错误似乎与执行()的SQLSRV或PDO实现有关.
我已经在stackoverflow,serverfault和全能的Google上搜索了有关此内容的信息.返回的唯一类型的结果是用户需要在一个语句/执行中执行多个查询/插入.我的问题恰恰相反; 我希望只执行一个插入语句,但总是会执行多个插入语句.
问题是:为什么会发生这种情况,如何防止多次插入?
每次请求更新
访问此文件的代码是来自另一个网页的一个单一链接.该页面列出了允许用户访问的当前文件,并提供了download.php脚本的链接,用于验证,更新和实际提供PDF.
查看页面有一个链接列表(打印在for循环中),排列如下:
<a href='download.php?f={$item['name']}&t={$type}' target='_blank'>{$item['name']}</a>
Run Code Online (Sandbox Code Playgroud)
当用户点击该链接时,除了上面的download.php的其他代码之外,下面的脚本也会运行.它成功地提供PDF文件.内容由download.php作为PHP标题/内联PDF发送:
见下面的代码
查看服务器日志显示对download.php文件的两个 GET请求:
2012-02-14 17:44:37 W3SVC1785071458 172.17.31.254 GET /download.php f=06304844-1A.pdf&t=av 4090 - 172.17.31.112 Mozilla/5.0+(Windows+NT+6.1)+AppleWebKit/535.7+(KHTML,+like+Gecko)+Chrome/16.0.912.77+Safari/535.7 200 0 0
2012-02-14 17:44:37 W3SVC1785071458 172.17.31.254 GET /download.php f=06304844-1A.pdf&t=av 4090 - 172.17.31.112 Mozilla/5.0+(Windows+NT+6.1)+AppleWebKit/535.7+(KHTML,+like+Gecko)+Chrome/16.0.912.77+Safari/535.7 200 0 0
Run Code Online (Sandbox Code Playgroud)
我已经在Firefox,Opera和IE(6-9b)中测试过,结果是一样的.
更新两个
将整个download.php文件放在这里:
<?php
session_start();
require("cgi-bin/auth.php");
// Don't timeout when downloading large files
@ignore_user_abort();
@set_time_limit(0);
//error_reporting(E_ALL);
//ini_set('display_errors',1);
function getfile() {
require('cgi-bin/connect_db_pdf.php');
//Verify …Run Code Online (Sandbox Code Playgroud) 我正在使用PyQt作为一个简单的应用程序,它使用JSON格式的字符串从日志文件中读取,并在表中很好地输出它们.
除非我尝试从"加载"功能发出信号,否则一切都按预期工作.该信号由主窗口拾取,位于设计用于为表格提供新信息的插槽中.
如果没有发出信号,表格将完全正确地填充:

通过取消注释self.emit以便发出信号IS,表格最终不完整:

正如您在第一张图片中看到的那样,表格未排序,但所有字段都已填充.在第二个图像中,表被排序,但有些字段是空白的!
填充表并发送信号的代码:
#openLog function does stuff, then populates the table as follows
self.ui.tableWidget.setRowCount(len(entries))
self.ui.tableWidget.verticalHeader().setVisible(False)
for i, row in enumerate(entries):
for j, col in enumerate(row):
item = QtGui.QTableWidgetItem(col)
self.ui.tableWidget.setItem(i, j, item)
#When this is uncommented, the table ends up having a lot of blank cells.
#self.emit(QtCore.SIGNAL("updateSignal"))
Run Code Online (Sandbox Code Playgroud)
用于接收信号的代码,并执行:
#main window class
#__init__
self.ui.tableWidget.connect(self,QtCore.SIGNAL("updateSignal"),self.updateTable)
def updateTable(self):
self.ui.tableWidget.sortItems(0,QtCore.Qt.DescendingOrder)
Run Code Online (Sandbox Code Playgroud)
程序流称为:program_init-> register_signal.用户操作打开日志 - > openLog函数,填充表/发出信号 - >信号接收/度假表
对于这种方法,我使用的是信号和插槽,就好像我没有,QT/Python会抛出一堆警告,说明从函数重绘GUI/Pixmap是不安全的.
问题: 如何在我想要的列上进行QTableWidget排序,同时确保表格完全填充?
我想访问我在另一个 php 文件中声明的会话变量。
我怎样才能做到这一点?
这就是我所做的。
测试.php
$_SESSION['SESS_VERSION'] = $member['Version'];
session_write_close();
header('location: '.$_SESSION['SESS_VERSION']);
Run Code Online (Sandbox Code Playgroud)
该会话变量正在工作,我已正确重定向到另一个页面。
例如在该页面上:
test2.php
Run Code Online (Sandbox Code Playgroud)
我正在从 javascript 调用 php 脚本来返回 JSON 格式的数据。
我在该脚本中试图做的test3.php是访问会话变量test.php
这是代码:
<?php
header("Content-type: application/json; charset=UTF-8");
echo '{ "results" : [ ';
$result = dbMySql::Exec("SELECT
m.data1
v.data2,
k.data3
FROM {$_SESSION['SESS_MAIN_BASE']} m, {$_SESSION['SESS_SECOND_BASE']} v, {$_SESSION['SESS_THIRD_BASE']} k");
$result_array = array();
?>
Run Code Online (Sandbox Code Playgroud)
为什么我无法访问此 php 页面上的任何会话变量?也许我的语法不正确。但这是我收到的错误:
Warning: Cannot modify header information - headers already sent
Run Code Online (Sandbox Code Playgroud)
当然还有变量为空的错误。