MySQL和PHP的问题

时间:2010-10-14 18:30:55

标签: php mysql

PHP:

<?php
if (isset($_POST['name'])){
 mysql_connect("localhost", "db", "test") or die(mysql_error());
 mysql_select_db("db") or die(mysql_error());
 $tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'");
 echo $tmp[0];
}
else
{
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<input name="name" type="text">
<input type="submit" name="submit" value="submit" >
</form>
<?php
}
?>

MYSQL:

CREATE TABLE IF NOT EXISTS `Channels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `commercial` tinyint(1) NOT NULL DEFAULT '0',
  `usrid` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Daten für Tabelle `Channels`
--

INSERT INTO `Channels` (`id`, `name`, `commercial`, `usrid`) VALUES
(2, 'TEST', 0, 0);

如果我在输入中写入TEST,则$ tmp [0]为空

请帮助

3 个答案:

答案 0 :(得分:2)

问题在于您的查询:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'");

当您想要包含在字符串中的数组项时,需要将其括在花括号中:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='{$_POST['name']}'");

然而不要这样做。 此查询非常不安全,并且对SQL注入开放。首先确保在PHP配置中将magic_quotes_gpc设置为off(它不安全且不可靠 - 您可以使用var_dump(get_magic_quotes_gpc());确认它是否打开)。然后执行以下操作:

$tmp = mysql_query("SELECT commercial FROM Channels WHERE name='" . mysql_real_escape_string($_POST[name]) . "'");

这有助于确保您的网站不会受到SQL注入攻击。

我还鼓励您研究更现代,更安全的数据库查询方式,例如PDOMySQLi

答案 1 :(得分:1)

你在这里有混合撇号和引号:

 $tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'");

应该是:

 $tmp = mysql_query('SELECT commercial FROM Channels WHERE name="'.$_POST['name'].'"');

编辑:并且,正如其他人所提到的,如果Magic Quotes已启用,则关闭{{3}}并添加mysql_real_escape_string(),这样做是谨慎的,所以:

 $tmp = mysql_query('SELECT commercial FROM Channels WHERE name="'.mysql_real_escape_string($_POST['name']).'"');

另外,为了澄清,我从外引号切换到撇号的原因是变量解析(与自己做的工作相反)增加了一些开销。

答案 2 :(得分:0)

  1. 您遇到语法错误:
    $tmp = mysql_query("SELECT commercial FROM Channels WHERE name='.$_POST[name].'");
  2. 你可能想要:

    $tmp = mysql_query("SELECT commercial FROM Channels WHERE name='" . $_POST['name'] ."'");
    

    否则,如果你的名字是“Some Thing”,你就会问mysql“.Some Thing”。 (也不要像我写的那样使用那个查询,这是一个安全问题,见下文)

    1. $tmp不是一个应该是结果的数组。您需要调用其中一个mysql_fetch_*函数来获取结果。您还应该使用mysql_error()检查错误,以确保查询成功。例如:

      if(!mysql_error()){      $ row = mysql_fetch_row($ tmp);      //对数据行做一些事情 }

    2. 写入的查询是一个安全问题。有人可以使用它来接管你的数据库并做任何他们想做的事情。使用mysql_real_escape_string()来避免:

      $ tmp = mysql_query(“SELECT commercial FROM Channels WHERE name ='”。mysql_real_escape_string($ _ POST ['name'])。“'”);