[英]How can I correct my PHP code for this SQL query?
我已经弄了好一阵子,我快到了。 只需要穿过我碰到的那堵墙。
我有以下表格:
tracks (trackid, tracktitle, albumid, composerid)
albums (albumid, albumname)
composers (composerid, composername)
我可以通过PhpMyAdmin的“ SQL”选项卡使用
INSERT INTO tracks (tracktitle, albumid, composerid) VALUES ('New Song', 1, 1);
而且效果很好。
我的PHP表单虽然没有做相同的事情,但我一定忽略了一些事情。 有人可以检出我的addtrack页面的代码,然后告诉我哪里出了问题吗?
if (isset($_POST['tracktitle'])):
// A new track has been entered
// using the form.
$cid= $_POST['cid'];
$tracktitle = $_POST['tracktitle'];
$albs = $_POST['albs'];
if ($cid == '') {
exit('<p>You must choose an composer for this track.
Click "Back" and try again.</p>');
}
$sql = "INSERT INTO tracks SET
tracks.tracktitle='$tracktitle'" ;
if (@mysql_query($sql)) {
echo '<p>New track added</p>';
} else {
exit('<p>Error adding new track' . mysql_error() . '</p>');
}
$trackid = mysql_insert_id();
if (isset($_POST['albs'])) {
$albs = $_POST['albs'];
} else {
$albs = array();
}
$numAlbs = 0;
foreach ($albs as $albID) {
$sql = "INSERT IGNORE INTO tracks (trackid, albumid,
composerid) VALUES " .
"($trackid, $albs, $cid)";
if ($ok) {
$numAlbs = $numAlbs + 1;
} else {
echo "<p>Error inserting track into album $albID: " .
mysql_error() . '</p>';
}
}
?>
<p>Track was added to <?php echo $numAlbs; ?> albums.</p>
<p><a href="<?php echo $_SERVER['PHP_SELF']; ?>">Add another
track</a></p>
<p><a href="tracks.php">Return to track search</a></p>
<?php
else: // Allow the user to enter a new track
$composers = @mysql_query('SELECT composerid, composername
FROM composers');
if (!$composers) {
exit('<p>Unable to obtain composer list from the
database.</p>');
}
$albs = @mysql_query('SELECT albumid, albumname FROM albums');
if (!$albs) {
exit('<p>Unable to obtain album list from the
database.</p>');
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>"
method="post">
<p>Enter the new track:<br />
<textarea name="tracktitle" rows="1" cols="20">
</textarea></p>
<p>Composer:
<select name="cid" size="1">
<option selected value="">Select One</option>
<option value="">---------</option>
<?php
while ($composer= mysql_fetch_array($composers)) {
$cid = $composer['composerid'];
$cname = htmlspecialchars($composer['composername']);
echo "<option value='$cid'>$cname</option>\n";
}
?>
</select></p>
<p>Place in albums:<br />
<?php
while ($alb = mysql_fetch_array($albs)) {
$aid = $alb['albumid'];
$aname = htmlspecialchars($alb['albumname']);
echo "<label><input type='checkbox' name='albs[]'
value='$aid' />$aname</label><br />\n";
}
?>
排序后,我可以继续扩展它,并解决安全问题。 有人建议我研究PDO对我来说是新事物。 但是一次一个障碍。
谢谢
您的INSERT语法不正确。 您正在尝试使用UPDATE语法插入。
你在尝试:
INSERT INTO table_name SET field_name = '$value', another_field_name = '$another_value'
但是您应该这样做:
INSERT INTO table_name (
field_name,
another_field_name
)
VALUES (
'$value',
'$another_value'
)
另外,您实际上应该使用addslahes(),如下所示:
INSERT INTO table_name (
field_name,
another_field_name
)
VALUES (
'".addslashes($value)."',
'".addslashes($another_value)."'
)
否则,您的代码比煮土豆更容易被黑。 :)
编辑:查德·伯奇(Chad Birch)(下)建议使用参数化值,这显然比addlashes()更好。 老实说,我不知道PHP已经有了。
问题出在您的查询中。 尝试使用mysql_error函数获取有关您做错了什么的更多信息。
例如,您的INSERT语句格式不正确。
你有:
$sql="INSERT INTO tracks SET tracks.tracktitle='$tracktitle'"
应该是这样的:
$sql="INSERT INTO tracks (tracktitle) VALUES ('$tracktitle')";
我之前的回答是错误的(已删除)。 现在我了解到您的插入语法确实有效。
但是,您不执行的操作是转义您在查询中输入的值。 如果$ tracktitle包含任何无效字符(如单引号),则可能会中断查询。
您应该在构建插入查询之前添加以下行:
$tracktitle = mysql_real_escape_string($tracktitle);
您当前的代码非常琐。 如果要插入一首歌曲,并且要在歌曲名称中输入YourF ... ed,哦,顺便说一句。 删除数据库YourDataBaseName; 您应该尝试想象会发生什么。
这称为SQL注入。 因为您没有正确地转义该值,所以其他人可以通过将陈述插入到html表单字段中来关闭该陈述。
我不知道这是否是您的查询现在不起作用的原因(仅当您键入无效字符时它才会中断),但是目前这是一个严重的问题。
为了找出确切的错误,当mysql_query()返回false时,应该显示mysql_error()的结果。 这可能比我们在这里所做的任何随机猜测都对您有更大的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.