2014-05-03 63 views
1

实际上,我对此感到陌生,并且遇到了插入到mysql属性的问题。无法在php中使用MYSQL INSERT INTO

我创建了两个表格,即问题和答案。用户可以通过html表单提交数据(对于两个表)。由于一些未知的错误,数据没有插入到答案表中,问题表没有这样的问题。 奇怪的是,两个表的插入php代码除了变量的名字几乎相同。

singleques_info.php代码:

<?PHP 

session_start(); 
$t=$_GET['p']; 
$ans= ""; 
$error_message = ""; 
$num_rows = 0; 

function quote_smart($value, $handle) 
{ 
    if (get_magic_quotes_gpc()) 
     { 
     $value = stripslashes($value); 
     } 
    if (!is_numeric($value)) 
     { 
     $value = "'" . mysql_real_escape_string($value, $handle) . "'"; 
     } 
    return $value; 
    } 

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
    { 
     $ans = $_POST['ans']; 
     $ans = htmlspecialchars($ans); 
     $uLength = strlen($ans); 
     if ($uLength <=100) 
      { 
     $error_message = ""; 
      } 
      else 
      { 
      $error_message = $error_message . "Username must be between 10 and 20 characters" . "<BR>"; 
      } 


    if ($error_message == "") 
     { 
     $username = "root"; 
     $password = ""; 
     $database = "techinsight"; 
     $server = "127.0.0.1"; 
     $db_handle = mysql_connect($server, $username, $password); 
     $db_found = mysql_select_db($database, $db_handle); 

     if ($db_found) 
     { 
     echo "connected"; 
     $ans = quote_smart($ans, $db_handle); 
     $SQL = "SELECT * FROM answers WHERE answer= $ans"; 
     $result = mysql_query($SQL); 
     $num_rows = mysql_num_rows($result); 
      if ($num_rows > 0) 
      { 
      echo "Question already taken"; 
      } 
      else 
      }       
      $SQL = "INSERT INTO answers (Aid, answer, date) VALUES ($t, $ans, CURDATE())"; 
      $result = mysql_query($SQL); 
      mysql_close($db_handle); 

      session_start(); 
      $_SESSION['login'] = "1"; 

      header ("Location:ques_wala_main.php"); 
      echo "You are done."; 
      } 

     } 
     else 
     { 
      $errorMessage = "Database Not Found"; 
     } 

     } 
     //<div class="content_mess"> 
    /* else 
     { 
      session_start(); 
      $_SESSION['login'] = ""; 
      header ("Location: signup.php"); 
      echo "Please SignIn Before Asking...."; 
     } 
    // </div> */ 

} 

?> 

HTML表单:

<form id="ans" method="POST" name="ans" action="#"> 
    <div class="field extra"> 
    <label>your answer:</label> <br/> <br/> <br/> 
    <textarea name="ans" cols="70" rows="6"></textarea> 
    </div> 
    <br/> <br/> 
    <input type="submit" name="submit" value="submit" /> 
</form> 
+0

我也注意到你连接到DB ** **后,如果'($ ERROR_MESSAGE == “”)'并在此之前访问'mysql_real_escape_string($ value,$ handle)'。你上面连接到数据库吗? –

+0

另外,使用'$ t = $ _ GET ['p'];'这是来自POST方法的GET方法。 '$ t = $ _ GET ['p'];'从哪里填充? –

+0

实际上,此处使用GET方法从通过url传递的另一个页面检索变量。 – shibu

回答

1

的问题已经解决了OP加入以下脚本的顶部(S):

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

有找在服务器上不再支持mysql_*函数,并且不得不求助于切换到mysqli_*函数。

这已经通过多种意见谈得OP。


当现在使用mysqli_*功能(带有一个额外的选项):

添加错误报告给您的文件(S),这将在生产测试帮助的顶部。

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

MySQL的(错误报告的链接)


额外的API:

Use mysqli with prepared statements,或PDO

PDO的错误处理:

0

这个问题已经回答了评论,但我会扩大。

你似乎对两个方面感到困惑。首先是您正在使用的SQL语句的正确准备。每个陈述包含两个重要部分。您指定:

  1. 表中的列要使用:

    INSERT INTO答案(援助,答案,日期)

  2. 和值要与这些列使用方法:

    VALUES($吨,$ ANS,CURDATE())

MySQL syntax允许你在没有空格(或其他字符)的情况下让列名解封,所以这个部分没问题。然而,取决于列类型的值可能必须用单引号或双引号封装,例如,你必须封装值VARCHARDATEDATETIMEBLOB但对于数字类型,你通常不应这样做像INTDECIMAL或当你告诉MySQL服务器计算的东西它插入新记录之前(如CURDATE()10 + 5等)。因此,假如你的栏目有:

Aid - INT 
answer - VARCHAR 
date - DATE 

正确的SQL语句是(注意周围$ans单引号和缺乏引号周围CURDATE()):

INSERT INTO answers (Aid, answer, date) VALUES ($t, '$ans', CURDATE()) 

其他方面似乎迷惑你是如何PHP deals with strings。你正在做的是告诉PHP准备一行文本(字符串)并将其传递到MySQL服务器,以便服务器运行它并将结果传递回PHP(例如mysql_insert_id()就是这样的结果)。从这个过程的开始到结束,PHP都不知道SQL语句是什么以及如何准备它。它所知道的是“这里是一个字符串,我需要在其中添加一些变量”。因此,假如答案数32a submitted answer,你的代码的这两部分:

$SQL = "SELECT * FROM answers WHERE answer= $ans"; 
[...] 
$SQL = "INSERT INTO answers (Aid, answer, date) VALUES ($t, $ans, CURDATE())"; 

会产生以下正确的字符串,但不正确的SQL语句:

SELECT * FROM answers WHERE answer= a submitted answer 
INSERT INTO answers (Aid, answer, date) VALUES (32, a submitted answer, CURDATE()) 

希望的解决方案是现在很明显。

上面说的,我只是回应支付它前进(我们所有的人必须从某个地方开始)。这种编码风格已经过时,而且值得讨论(甚至作为一种学习手段)。它永远不会看到生产环境。

编辑:

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead 

上面应该是一个通知水平,可能不是一个问题。如果您想查询功能是否可用运行下面的脚本:

<?php 
    $a = array(
     'mysql_connect', 
     'mysql_real_escape_string', 
     'mysql_query', 
     'mysql_fetch_assoc', 
    ); 

    foreach ($a as $f) 
     var_dump(function_exists($f)); 
+0

请在你的回答中加入'$ ans'必须被引用为'$ SQL =“SELECT * FROM answers WHERE answer = $ ans”;' –