sql insert语句有时工作其他时间不工作

时间:2011-06-25 16:05:28

标签: php mysql sql database web-hosting

我正在构建一个应用程序,我有一个奇怪的问题,有时一个sql语句将起作用,下一次调用完全相同的sql语句根本不起作用。

我个人怀疑它的托管服务提供商使用的可能只是不够快,无法接受大量的SQL数据库调用,但我想我至少会问是否有其他人曾经遇到类似的问题

2 个答案:

答案 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进程。您可能需要对其进行调整,甚至可以让它运行每个查询,而不仅仅是插入(如果需要)。