我正在构建一个应用程序,我有一个奇怪的问题,有时一个sql语句将起作用,下一次调用完全相同的sql语句根本不起作用。
我个人怀疑它的托管服务提供商使用的可能只是不够快,无法接受大量的SQL数据库调用,但我想我至少会问是否有其他人曾经遇到类似的问题
答案 0 :(得分:1)
它可能是您动态添加到查询语句的值。您应该转义值以确保它们不会破坏您的查询。
在PHP中,您可以使用mysql_escape_string()函数。这里的文档:http://us3.php.net/mysql_escape_string
此外,如果您从浏览器运行查询,如果您执行以下操作,通常可以看到错误:
$query = mysql_query("QUERY", $db_connection) or trigger_error(mysql_error());
答案 1 :(得分:0)
如果您在共享主机上并且无法修改数据库的my.cnf文件,则假设您无法访问mysql常规查询日志,则可以按照以下方式起草函数:
function dbInsertQuery($query, $conn) {
$logFile = "/path/to/file.txt";
$isProd = FALSE;
// run your security checks on the query here
$mysql_query($query, $db_connection) or trigger_error(mysql_error());
if (!$isProd && is_writable($logFile)) {
if (!handle = fopen($logFile, 'a')) {
echo "cannot open dbInsertQuery's log file: " . $logFile;
exit;
}
$logLine = date(DATE_RFC822) . " - " . $query;
if (fwrite($handle, $logLine) === FALSE) {
echo "cannot write to dbInsertQuery's log file: " . $logFile;
exit;
}
fclose($handle);
}
}
这将允许您将所有查询记录到日志文件中。我设置了一个$isProd
变量供您切换开发,如果设置为TRUE
的值,它将不会记录到该文件,并将完全跳过who fopen进程。您可能需要对其进行调整,甚至可以让它运行每个查询,而不仅仅是插入(如果需要)。