【问题标题】:MySQL query fails sometimes when using Internet Explorer使用 Internet Explorer 时,MySQL 查询有时会失败
【发布时间】:2009-09-03 14:39:48
【问题描述】:

我是 php 和 MySQL 的新手。我有一个网站,用户可以在其中选择一个州并显示该州的医院。它在所有州的 FireFox 中都能正常工作,但在 IE 中,当我拥有数百家医院的州时,屏幕会闪烁,最终我会收到一条无法显示页面的消息。对于拥有几家医院的较小州,查询在 IE 中运行良好。

再次,我是新手,所以任何建议都将不胜感激。代码如下:

<form action="redirect_hosp.php" method="get">

<?php

$link = mysql_connect('SERVERNAME.com', 'USERNAME', 'PASSWORD'); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 
/*print 'Connected successfully';*/ 
mysql_select_db(it_phys);

$sql = "SELECT distinct(state) FROM hospitals ORDER BY state";
$rs = mysql_query($sql)or die("Connection to DataBase failed");
print ("<div align=center>");
print("<font color='#008000' size='2' face='Tahoma'><b>Find a Hospital</b></font><br><br>");
print ("Select a State<br>");
print ("<SELECT name='State' onchange='form.submit();'>");
print("<OPTION value='none' selected></OPTION>\n");
for($i = 0; $i < mysql_num_rows( $rs ); $i++)
{
$tmp = mysql_fetch_row( $rs );
print("<OPTION value=\"$tmp[0]\">$tmp[0]</OPTION>\n");
}
print ("</SELECT>");
print ("</div>");
mysql_free_result($rs);
mysql_close($link);

?>


<?php
if(isset($_GET['State'])) 
{
  $State=$_GET['State'];
  print "<div align=center><br><br>";
  print "State Selected: ".$State;
  print "<br><br></div>";
  /* run query to pull members based on state */
  $link = mysql_connect('SERVERNAME.com', 'USERNAME', 'PASSWORD'); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 
/*print 'Connected successfully';*/ 
mysql_select_db(it_phys);

      $query = "SELECT
           hospitals.`Hospital Name`, hospitals.Address1,
           concat(rtrim(hospitals.City),', ',rtrim(upper(hospitals.State)), ' ', hospitals.zip) as City_State,
           hospitals.state,hospitals.`Phone Number`,hospitals.`Hospital Type`,hospitals.`Emergency Service`,
           hospitals.map
           FROM hospitals WHERE hospitals.state='".$State."' ORDER by hospitals.`Hospital Name`"; 


    $result = mysql_query($query) or die('Query failed: ' . mysql_error()); 
  /* show in table */
  // Printing results in HTML
    print "<style>

    h2 { border-bottom: 3px solid red; }
    table { border-bottom: 1px solid blue; align='left'; cellpadding=0; cellspacing=0 }
    td {border-bottom: 0px outset black; cellpadding=0 }

    </style>";
    print "<div align=center>";
    print "<table cellpadding='20'>";


    $i=0;
    $rows=mysql_num_rows($result);
    while($i < $rows) {
        print "<tr>";
        print "<style> td {border-bottom: 3px outset green; }</style>";
        print "<td valign='top' align='left'>";
        print "<font color='red'><strong>".mysql_result($result, $i, 0)."</strong></font>";
        print "<br>".mysql_result($result, $i, 1);
        print "<br><font color='red'>".mysql_result($result, $i, 2)."</font>";
        print "<br>".mysql_result($result, $i, 4);  
        print "</td>";
        print "<td width=350 valign='top' align='left'>";
        print "<br>Type: ".mysql_result($result, $i, 5);
        print "<br>Emergency Care: ".mysql_result($result, $i, 6);
        print "<br><br>";
        print "<a STYLE='text-decoration:none' target='_blank'
                 href='http://maps.google.com/maps?f=q&source=s_q&hl=en&q="
                .mysql_result($result, $i, 7)."'><b> Show Map</b></a>";     
        print "</td>";
        print "</tr>";

        $i=$i+1;

    }
mysql_free_result($result);
mysql_close($link);
}
print "</table>"
?> 

【问题讨论】:

  • 你怎么知道 MySQL 查询正在这样做?

标签: php sql mysql


【解决方案1】:

这里可能是这个部分:

print "<tr>";
print "<style> td {border-bottom: 3px outset green; }</style>";
print "<td valign='top' align='left'>";

您应该将样式数据上移到之前的样式标签。

关于你的 PHP 代码:

mysql_select_db(it_phys);

除非 it_phys 是一个常数,否则它应该被引用

mysql_select_db('it_phys');

而不是计算返回行数 N + 1 次的 for 循环,其中 N 是返回的行数,

for($i = 0; $i < mysql_num_rows( $rs ); $i++)
{
$tmp = mysql_fetch_row( $rs );
print("<OPTION value=\"$tmp[0]\">$tmp[0]</OPTION>\n");
}

试试这个 while 循环(并在数组周围使用括号):

while ($tmp = mysql_fetch_row($rs)) {
    print("<OPTION value=\"{$tmp[0]}\">{$tmp[0]}</OPTION>\n");
}

并使用 mysql_real_escape_string 转义进入数据库的所有输入:

$query = "SELECT
           `Hospital Name`, Address1,
           concat(rtrim(hospitals.City),', ',rtrim(upper(State)), ' ', zip) as City_State,
           state,`Phone Number`,`Hospital Type`,`Emergency Service`,
           map
           FROM hospitals WHERE state='".mysql_real_escape_string($State)."' ORDER by `Hospital Name`"; 

【讨论】:

  • 感谢您的详细回复。我会试试你的更改。
  • 您最初对样式放置的想法似乎是问题所在。我移动了它,它工作正常。谢谢!
【解决方案2】:

这可能与 MySQL 无关。不查看实际页面(链接?)很难说,但是您在标签属性和其他可能导致 IE 解析器出错的地方输出了许多原始未转义的数据库数据。

链接内的数据应使用urlencode() 进行转义。属性内的数据或其他数据可能应该使用htmlspecialchars() 转义,除非您知道不这样做是安全的。

(也就是说,“页面无法显示”可能是由 很多 因素引起的,其中一些是早期 DOM 访问、附加组件、缓存等。它们可能很难追踪。)

【讨论】:

  • 该网站是italianphysicians.com/find_a_hospital.php。在 IE 中访问它,尝试加利福尼亚看看问题。
  • 我目前无法访问 Windows PC。但是那些 4044 验证错误可能是一个开始:) validator.w3.org/…
  • 提示:尝试在&lt;select&gt; 组之后关闭您的&lt;form&gt;,而不是在页面底部。我认为 IE 的“外部”表格存在重大问题,这可能是导致错误的原因。
【解决方案3】:

您的 PHP 脚本可能在查询完成检索所有记录之前超时。您的脚本超时设置为多少?

此外,您需要学习如何将数据与逻辑以及逻辑与演示分开。

【讨论】:

  • PHP 脚本可能超时。我在哪里设置?如果你有时间,肯定需要更多关于分离问题的细节。
【解决方案4】:

由于页面是在服务器上生成的,因此查询不能“破坏”IE。也许是您生成的 HTML。

扫描您的代码时我注意到的一些事情:

  • 您不需要为每个查询都连接。只需打开一个连接并在最后关闭它。
  • 这是旧数据库吗?像“医院名称”这样的空格字段让我有些震惊……

【讨论】:

  • "您不需要为每个查询都连接。只需打开一个连接并在最后关闭它。"看起来像 2 个文件,一个有状态选择表单,另一个显示请求的表单。
  • 谢谢。我将尝试删除其中一个连接。我从一个站点下载了数据库并按原样使用它。更改字段名称以排除空格并不困难。
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 2013-06-30
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2012-05-26
  • 1970-01-01
相关资源
最近更新 更多