【问题标题】:Inputting form data to SQL将表单数据输入到 SQL
【发布时间】:2015-01-18 03:57:57
【问题描述】:

我只是想将表单数据发送到 SQL 数据库。

dbconnect.php 具有配置选项,并且确实有效,因为我能够在其他页面上检索我的表。

当我按下提交时,我可以将信息“回显”到表格/div 中,无论我是自己做 PHP,还是将其提交到另一个页面,即。添加事件.php

但是,我似乎无法弄清楚将其发送到 SQL 数据库时我做错了什么。现在,不幸的是,我已经为此做了无数小时,所以我的代码可能有点混乱,我可能正在使用不同形式的 sql、pdo 等。此时我的头脑爆炸了哈哈。

任何人,这是代码 - 第一个是表单页面,即。 form.php,第二个是表单调用的addevent.php。

<?php include 'header.php'?>
<?php include 'dbconnect.php'?>




<form id="addevent" action="addevent.php" method="post">
	<fieldset>
		<legend>Add an Event</legend>
			<label for="showtitle">Title of Show</label>
				<input type="text" id="showtitle" name="showtitle" value=""></br>
			<label for="h">Headliner</label>
				<input type="text" id="h" name="h" value="">
			</br>
			<label for="fone">First Feature Act Name</label>
				<input type="text" id="fone" name="fone" value="">
			</br>
			<label for="ftwo">Second Feature Act Name</label>
				<input type="text" id="ftwo" name="ftwo" value="">
			</br>
			<label for="fthree">Third Feature Act Name</label>
				<input type="text" id="fthree" name="fthree" value="">
			</br>
			<label for="host">Host Name</label>
				<input type="text" id="host" name="host" value="">
			</br>
			<label for="aone">First Additional Performer Name</label>
				<input type="text" id="aone" name="aone" value="">
			</br>
			<label for="atwo">Second Additional Performer Name</label>
				<input type="text" id="atwo" name="atwo" value="">
			</br>
			<label for="athree">Third Additional Performer Name</label>
				<input type="text" id="athree" name="athree" value="">
			</br>
			<label for="afour">Fourth Additional Performer Name</label>
				<input type="text" id="afour" name="afour" value="">
			</br>
			<label for="stimeu">Event Start Time</label>
				<input type="time" id="stimeu" name="stimeu" value="">
			<input type="text" id="stimef" name="stimef" class="nodisplay" value="No Fill"></br>
			<label for="etimeu">Event End Time</label>
				<input type="time" id="etimeu" name="etimeu" value="">
			<input type="text" id="etimef" name="etimef" class="nodisplay" value="No Fill"></br>
			<label for="dateu">Event Date</label>
				<input type="date" id="dateu" name="dateu" value="">
			<input type="text" id="datef" name="datef" class="nodisplay" value="No Fill"></br>
			<label for="loadd">Address</label>
				<input type="text" id="loadd" name="loadd" value="">
			<label for="locity">City</label>
				<input type="text" id="locity" name="locity" value="">
			<label for="loprov">Prov</label>
				<input type="text" id="loprov" name="loprov" value=""></br>
			<input type="text" id="lourl" name="lourl"value=""></br>
			<label for="price">Price</label>
				<input type="text" id="price" name="price" value="">
			<label for="turl">Buy Tickets URL</label>
				<input type="text" id="turl" name="turl" value=""></br>
			<label for="pname">Promoter Name</label>
				<input type="text" id="pname" name="pname" value=""></br>
			<label for="purl">Promoter URL</label>
				<input type="text" id="purl" name="purl" value="">
			<label for="ptel">Promoter Telephone</label>
				<input type="tel" id="ptel" name="ptel" value="">
			<label for="pemail">Promoter email</label>
				<input type="email" id="pemail" name="pemail" value=""></br>
				<input type="submit" id="submit" value="Add Event">
	</fieldset>
</form>
</div>

				
				
				
				
				
				
				
				
				
				
				
				
				
				<?php include 'footer.php'?>
			
			

<?php include 'dbconnect.php'?>
<?php 

if(isset($_POST['showtitle'], $_POST['h'], $_POST['fone'], $_POST['ftwo'], $_POST['fthree'], $_POST['aone'], $_POST['atwo'], $_POST['athree'], $_POST['afour'], $_POST['stimeu'], $_POST['stimef'], $_POST['etimeu'], $_POST['etimef'], $_POST['dateu'], $_POST['datef'], $_POST['loadd'], $_POST['locity'], $_POST['loprov'], $_POST['lourl'], $_POST['price'], $_POST['turl'], $_POST['pname'], $_POST['purl'], $_POST['ptel'], $_POST['pemail']))



$sql="INSERT INTO may (id, showtitle, headline, fone, ftwo, fthree, aone, atwo, athree, afour, stimeu, stimef, etimeu, etimef, dateu, datef, loadd, locity, loprov, lourl, price, turl, pname, purl, ptel, pemail, addedstamp) 
VALUES ('$showtitle','$h','$fone','$ftwo','$fthree','$aone','$atwo','$athree','$afour','$stimeu','$stimef','$etimeu','$dateu','$datef','$loadd','$locity','$loprov','$lourl','$price','$turl','$pname','$purl','$ptel','$pemail')";
$result = $conn->query($sql); 
}
if(!mysql_query($sql,$conn)){

    die('Error: ' . mysql_error());

} 
    echo("<br>Input data is a success");



$mysql_close($conn)
?>
<h1>Form Data</h1>
<?php echo $_POST['showtitle']; ?><br>
<?php echo $_POST['h']; ?><br>
<?php echo $_POST['fone']; ?><br>
<?php echo $_POST['ftwo']; ?><br>
<?php echo $_POST['fthree']; ?><br>
<?php echo $_POST['host']; ?><br>
<?php echo $_POST['aone']; ?><br>
<?php echo $_POST['atwo']; ?><br>
<?php echo $_POST['athree']; ?><br>
<?php echo $_POST['afour']; ?><br>
<?php echo $_POST['stimeu']; ?><br>
<?php echo $_POST['stimef']; ?><br>
<?php echo $_POST['etimeu']; ?><br>
<?php echo $_POST['etimef']; ?><br>
<?php echo $_POST['dateu']; ?><br>
<?php echo $_POST['datef']; ?><br>
<?php echo $_POST['loadd']; ?><br>
<?php echo $_POST['locity']; ?><br>
<?php echo $_POST['loprov']; ?><br>
<?php echo $_POST['lourl']; ?><br>
<?php echo $_POST['turl']; ?><br>
<?php echo $_POST['pname']; ?><br>
<?php echo $_POST['purl']; ?><br>
<?php echo $_POST['ptel']; ?><br>
<?php echo $_POST['pemail']; ?><br>

编辑:我的大脑处于半关闭状态,所以我忘记了一些相关信息:

我得到的主要错误是: 注意:未定义变量:第 12 行 C:...\addevent.php 中的 showtitle 对于每个变量/名称/您想调用的任何内容。

我从其他人的帖子和答案中尝试了多种方法,但由于某种原因,我无法让插入 sql 工作。我可以很好地检索,很好地回声,只需插入我遇到的重大问题。如果有人甚至可以向我展示我应该使用的代码的基本格式/基本结构/语法......或者指出我正确的方向,那就太棒了。网上的很多东西都已经过时了,使用的是旧的 api,或者只是其中包含大量 SQL 注入的小教程,我发现很难在互联网上找到 UP TO DATE 教程为了这。

这是在我的“.php”页面上为我工作的语法,我在其中检索表行。 (效果很好)。

$sql = "SELECT id, featuref, featurel, hostf, hostl, openf, openl, midf, midl, otherf, otherl, additionalf, additionall, time, datec, location, locationurl, price, ticketurl, showname FROM january ORDER by date ASC, time ASC";
$result = $conn->query($sql);




if ($result->num_rows > 0) {
	echo 'Show';
	
     // output data of each row
     while($row = $result->fetch_assoc()) {
         echo "<table class='col-lg-12' id='event-container_'><th><h1 class='event-title-words'>
". $row["showname"]. "</h1>
            </th>
	 	
     }
     echo "Done";
} else {
     echo "0 results";
}

$conn->close();

这里有一个缩短的版本,如果有人想编辑,可以更轻松地进行编辑,或者向我展示可能的正确方法。

<?php include 'dbconnect.php'?>
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
} 


<?php 

if(isset($_POST['showtitle']))



$sql="INSERT INTO may (id, showtitle, addedstamp) 
VALUES ('$showtitle')";
$result = $conn->query($sql); 
}
if(!mysql_query($sql,$conn)){

    die('Error: ' . mysql_error());

} 
    echo("<br>Input data is a success");



$conn->close();
?>
<h1>Form Data</h1>
<?php echo $_POST['showtitle']; ?><br>

php include dbconnect.php 下一行就是dbconnect.php 文件中的内容,不包括servername、username、db info ...

dbconnect 确实有效。只是把信息放在那里是为了帮助,因为我的代码太乱了。

ID 用于自增,添加的时间戳应该只是表单提交到数据库时的时间戳。

<?php include 'dbconnect.php'?>
<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

$showtitle = $_POST['showtitle'];
$h = $_POST['h'];
$fone = $_POST['fone'];
$ftwo = $_POST['ftwo'];
$fthree = $_POST['fthree'];
$aone = $_POST['aone'];
$atwo = $_POST['atwo'];
$athree = $_POST['athree'];
$afour = $_POST['afour'];
$stimeu = $_POST['stimeu'];
$stimef = $_POST['stimef'];
$etimeu = $_POST['etimeu'];
$etimef = $_POST['etimef'];
$dateu = $_POST['dateu'];
$datef = $_POST['datef'];
$loadd = $_POST['loadd'];
$locity = $_POST['locity'];
$loprov = $_POST['loprov'];
$lourl = $_POST['lourl'];
$price = $_POST['price'];
$turl = $_POST['turl'];
$pname = $_POST['pname'];
$purl = $_POST['purl'];
$ptel = $_POST['ptel'];
$pemail = $_POST['pemail'];

if(isset($_POST['showtitle'], $_POST['h'], $_POST['fone'], $_POST['ftwo'], $_POST['fthree'], $_POST['aone'], $_POST['atwo'], $_POST['athree'], $_POST['afour'], $_POST['stimeu'], $_POST['stimef'], $_POST['etimeu'], $_POST['etimef'], $_POST['dateu'], $_POST['datef'], $_POST['loadd'], $_POST['locity'], $_POST['loprov'], $_POST['lourl'], $_POST['price'], $_POST['turl'], $_POST['pname'], $_POST['purl'], $_POST['ptel'], $_POST['pemail']))

{

$sql="INSERT INTO may (showtitle, h, fone, ftwo, fthree, aone, atwo, athree, afour, stimeu, stimef, etimeu, etimef, dateu, datef, loadd, locity, loprov, lourl, price, turl, pname, purl, ptel, pemail) 
VALUES ('$showtitle','$h','$fone','$ftwo','$fthree','$aone','$atwo','$athree','$afour','$stimeu','$stimef','$etimeu','$etimef,'$dateu','$datef','$loadd','$locity','$loprov','$lourl','$price','$turl','$pname','$purl','$ptel','$pemail')";
$result = $conn->query($sql); 
}
if($result){
 echo "Success"; 
}

else { 
trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}

$conn->close()
?>

而我现在的错误是 警告:出现错误....您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '2015-12-06'、'12-06-2015'、'123 Middle Road'、'London'、'ON'、'@987654321 附近使用的正确语法@' 在 C:\xampp\htdocs\comedyscene\addevent.php 第 48 行的第 2 行

【问题讨论】:

  • 您是否遇到任何类型的错误?请告诉我们。
  • 我的印象是您的数据库连接是mysqli_,在您的查询$result = $conn-&gt;query($sql); 中使用面向对象的方法 - 而mysql_ 不支持此方法。我认为您正在混合 MySQL API,它们不会相互混合。例如if(!mysql_query($sql,$conn)){,理论上你会查询两次。所以你需要向我们展示你是如何连接的,使用哪个 MySQL API。
  • 另外,您的列和值似乎不匹配。另一件事,你只是检查if(isset($_POST['showtitle']...,但没有分配任何东西。这里有太多事情要做。
  • 列和值不匹配是什么意思? h 和标题?很好,我解决了这个问题,但结果相同。
  • 再次查看(重新加载)我的 cmets,尤其是第一个和第二个关于您只检查而不分配任何内容的内容。然后你在INSERT INTO may (id, 中有id 我在你的值中看不到任何匹配“id”的东西。然后这个$mysql_close($conn)什么都不做。

标签: php sql forms sql-insert


【解决方案1】:

我将概述错误。

if(isset($_POST['showtitle'].... 缺少左大括号{,在使用error reporting 时应该会导致解析错误。

您也没有分配任何东西,您只是检查您的 POST 是否已设置。

您需要做(将变量分配给 POST):

$showtitle = $_POST['showtitle'];

应该遵循if(isset($_POST['showtitle'], $_POST['h'],....{

并按照相同的模式对其他人做同样的事情。

出于几个原因,应删除以下块。您正在使用mysqli_ 连接,然后使用mysql_ 函数,它们不会相互混合。

if(!mysql_query($sql,$conn)){

    die('Error: ' . mysql_error());

}

应该是(并且很可能您使用的是mysqli_,而不是mysql_

if($result){
 echo "Success"; 
}

else { 
trigger_error("there was an error....".$conn->error, E_USER_WARNING);
}

然后这个$mysql_close($conn) 应该读作$conn-&gt;close();

正如我在 cmets 中指出的那样,您还存在不匹配的列和值,其中一个是 id,它不会反映在您的 VALUES 中

$sql="INSERT INTO may (id,

你有足够的时间去修复你的代码。


在文件顶部添加错误报告,这将有助于发现错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告只能在暂存阶段完成,而不能在生产阶段完成。


我还想指出,当使用这种方法时,您对SQL injection 持开放态度,use mysqli with prepared statementsPDO with prepared statements它们更安全


编辑:

根据您的编辑:https://stackoverflow.com/revisions/28006989/3

$sql="INSERT INTO may (id, showtitle, addedstamp) 
VALUES ('$showtitle')";

您选择了 3 列,但只插入了 1 个值。如果要自动设置id 和时间戳列(auto_increment 等),则在 INSERT 中不需要它们。

另外,if(isset($_POST['showtitle'])) 仍然缺少大括号 {,并且仍然没有分配任何东西。

还在使用

if(!mysql_query($sql,$conn)){

    die('Error: ' . mysql_error());

}
  • 删除它

如果您希望为addedstamp 添加当前时间戳,请使用 MySQL 的 NOW() 函数:

即:

.... ,'$ptel','$pemail', NOW())";

逃避你的价值观:

$showtitle = stripslashes($_POST['showtitle']);
$showtitle = mysqli_real_escape_string($conn, $_POST['showtitle']);
  • 并对其他人做同样的事情。

另一个编辑:

您在'$etimef,'$dateu' 的值中缺少$etimef 的报价,应该是'$etimef','$dateu'

【讨论】:

  • 谢谢,我似乎取得了进展。对于带有“url”的“输入”框,我是否需要 html 特殊字符或类似的东西?我现在收到此错误。警告:出现错误....您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '2015-12-06'、'12-06-2015'、'123 Middle Road'、'London'、'ON'、'@987654326 附近使用的正确语法@' 在 C:\xampp\htdocs\comedyscene\addevent.php 第 48 行的第 2 行
  • @AlanHill 重新加载我的答案并查看 Escape your values: 下的底部附近 - 并再次查看我的整个答案。
  • @AlanHill 您的价值中缺少'$etimef 的报价,应该是'$etimef' - 现在这是一个很大的调试问题。您需要检查您的代码并检查是否缺少引号等。我现在必须走了。祝你好运。
  • 感谢所有帮助。至少它现在正在前进。出现新错误 --> 致命错误:无法在 C:\xampp\htdocs\...\addevent 中对函数调用的结果使用 isset()(您可以改用“null !== func()”) .php 位于第 61 行,祝您晚安!非常感谢。
  • 不客气@AlanHill - 我建议你使用if(isset($_POST['submit'])){ // code to execute } 开始。使用empty() 和条件语句来检查它们是否为空。我现在真的要睡觉了。如果我的回答确实解决了大部分或全部问题,请通过接受将其标记为已解决。但是将您的提交命名为&lt;input type="submit" id="submit" value="Add Event" name="submit"&gt;,以便它与我告诉您使用的条件一起工作。这会让你现在就开始。
【解决方案2】:

您的代码中出现了 3 个主要问题:

  • 语法错误
  • 变量使用
  • MySQL API

语法错误

有一些大括号放置不正确,首先出现在代码第 11 行的“if(isset(...”) 之后。

变量使用

$showtitle 是一个未定义的变量,因为如果你不打开 PHP 配置选项register_globals,你将无法使用这种格式来接收 post 数据。这个选项在 PHP 5.3.0 中已被弃用,将在 PHP 5.4 中删除.0.其实4.2.0以后这个选项默认是off而不是on

MySQL API

好像你没有给你的代码命名为'dbconnect.php',所以我不知道你使用哪种方式连接MySQL数据库。所以我只写我的连接和插入数据版本,完整代码如下(我削减了一些变量以使其简短易读):

<?php //include 'dbconnect.php'?>
<?php 

if(isset($_POST['showtitle'], $_POST['h'], $_POST['fone'])){
    /*use your own variables to recive post data*/
    $showtitle = $_POST['showtitle'];
    $h = $_POST['h'];
    $fone = $_POST['fone'];
    //connect database
    $con = mysql_connect("localhost","root","");
    //check if connect success
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }
    //select your database
    mysql_select_db("temp_projects");
    //run insert query

    //if you do have an "id" column which is auto increasing, the sql string should NOT contain it
    $sql="INSERT INTO may (showtitle, headline, fone) VALUES ('$showtitle','$h','$fone')";
    //if not, use sql which matches every column with the value
    //$sql="INSERT INTO may (id, showtitle, headline, fone) VALUES ('$id', '$showtitle','$h','$fone')";
    $result = mysql_query($sql);
    if(!$result){
        die('Error: ' . mysql_error());
    } 
        echo("<br>Input data is a success");

    //close connect
    mysql_close($con);
}
else{
    echo ("No Input Data.");
}

?>
<h1>Form Data</h1>
<?php echo $_POST['showtitle']; ?><br>
<?php echo $_POST['h']; ?><br>
<?php echo $_POST['fone']; ?><br>

【讨论】:

    【解决方案3】:

    您的变量未定义且为空。正如您在代码中看到的,您是第一次在查询中使用变量。

    简单的解决方案是将帖子的值加载到变量中,例如:

    $showtitle = $_POST['showtitle'];
    

    对查询中的所有变量执行此操作,并将代码放在插入的上方。

    下一点是,您正在插入一个 ID,但您的插入中没有适当的值。如果此列是自动递增列,则只需在查询中删除 ID,否则将值放入。

    插入运行后,您应该阅读有关 sql 查询的验证和清理的信息。在您的查询中,用户可以输入每个值,这不是您可能想要的。

    【讨论】:

    • 我已经尝试过(您的示例代码)并且我想出了相同类型的错误。无论我将变量放在哪里,它似乎都没有将它们识别为变量。我将从查询中删除 ID,我认为我需要它,但我假设你所说的如果它是自动递增的,那么我不需要告诉它输入 ID,因为它会知道这样做它。谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多