HTML表单 - PHP无法正确插入数据库

时间:2010-12-20 13:22:27

标签: php forms

我只是想做一个表格。 它类似于我现在填写:问题,文本,标签。

精细,

这是我打印表格的时候

function imprimir_formulario_pregunta(){ 
    $html = '<form id="pregunta" name ="pregunta" method="post" action="preguntas.php">';
    $html .= '<h2>Pregunta</h2>';

    $html .= '<input name="q" id="q" type="text" value=" "></input>';
    $html .= '<h2>Explica tu duda</h2>';
    $html .= '<textarea name="texto" id="texto" /
                    ></textarea>';
    $html .= '<h2>Etiquetas (separadas por comas)</h2>';
    $html .= '<input name="tags" id="tags"/>';
    $html .= '<input name="responde_a" style="display:none;" id="responde_a" value="0"/>';


    $html .= '<button name="pregunta" id="pregunta" type="submit" >Publicar</button>';

    $html .= '</form>';

    echo $html;

}

这是我收集数据的时间

if(isset($_POST['pregunta'])){
    $p_title = $_POST['q'];
    $p_text = $_POST['texto'];
    $p_et = $_POST['etiquetas'];
    $p_resp = $_POST['responde_a'];
    post_pregunta($p_title,$p_text, $p_et, $p_resp);

这是我处理数据的时候

function obtener_id_pregunta($p,$t){
    $consulta = mysql_query("SELECT * FROM preguntas WHERE pregunta='$p' && texto='$t'");
    while($item = mysql_fetch_array($consulta)){
        return $item['id'];
    }
}

function    post_pregunta($a,$t,$et,$r){
    mostrar_notificacion("hemos entrado");
    //// ******
    if($a != '' && $t != ''){
        $b = $a;
        guardar_pregunta($b,$t,$r);
        $id = obtener_id_pregunta($b,$t);
        $temp = new etiqueta(0, '');
        $basura = $temp->guardar_etiquetas($et, $id, $_SESSION['id']);



    }else
        mostrar_notificacion("hemos salido $a $t");
}

function guardar_pregunta($p,$t,$r){
    $id_tmp = $_SESSION['id'];
    $insert = "INSERT INTO preguntas (pregunta,texto,id_usuario,fecha,responde_a) VALUES ('$p','$t','$id_tmp',NOW(),'$r')";
    $qry = mysql_query($insert);
    if(mysql_affected_rows())
    {
        mostrar_notificacion("La pregunta $p ($t)($r) se guardo");
        return true;
    }
    else
    {
        mostrar_notificacion("Error Ingresando datos");
        return false;
    }
    return false;
}

结果:

我完成了数据库中的插入,但'q'字段有一个''值....

注意: 它会失去步骤 * *中的值,因为它进入条件,但它不会在下一个中出现同样的问题......

请告诉我你有我的答案,对此已经太久了...我本周需要这样做才能上课

提前致谢

3 个答案:

答案 0 :(得分:3)

很难看出发生了什么 - 正如@vincebowdren所说,你只需要在每一步都调试这个。

但是,更令人担忧的是,您在SQL查询中直接使用$ _POST数据 - 这是一个等待发生的SQL注入攻击

确保在查询中的mysql_real_escape_string函数中包含所有此类变量。

e.g:

 $insert = "INSERT INTO preguntas (pregunta,texto,id_usuario,fecha,responde_a) VALUES ('".mysql_real_escape_string($p)."','".mysql_real_escape_string($t)."','$id_tmp',NOW(),'".mysql_real_escape_string($r)."')";

有关详细信息,请参阅How can I prevent SQL injection in PHP?

答案 1 :(得分:0)

使用echo在每个阶段打印出麻烦的变量($ _POST ['q'],$ p_title,$ a)的值。然后你会看到它什么时候得到你没想到的值。

答案 2 :(得分:0)

@Toni Michel Caubet:我重新编写了一些代码,使其更具可读性,并且应该稍微更容易调试。请注意/* comments */。我已经把很多工作留给了你,只有一些指南在这里和那里。

接收数据:

if(isset($_POST['pregunta']))
{
    $p_title = $_POST['q'];
    $p_text  = $_POST['texto'];
    $p_et    = $_POST['tags'];
    $p_resp  = $_POST['responde_a'];

    /* Never trust user input, validate the data you're retrieving */

    /* Keep variable names the same, or risk confusing yourself later */
    post_pregunta($p_title, $p_text, $p_et, $p_resp);
}

流程数据:

function post_pregunta($p_title, $p_text, $p_et, $p_resp)
{
    mostrar_notificacion("hemos entrado");

    /* You should handle validation like this after initially receiving post
       data, the ideal would be to validate the data in a central location
       and then only pass the valid data on to other functions to avoid 
       having to recheck everything.
    */
    if($p_title != '' && $p_text != '')
    {
        guardar_pregunta($p_title, $p_text, $p_resp);
        $id = obtener_id_pregunta($p_title, $p_text);
        $temp = new etiqueta(0, '');
        $basura = $temp->guardar_etiquetas($p_et, $id, $_SESSION['id']);
    }
    else
    {
        mostrar_notificacion("hemos salido $p_title $p_text");
    }
}

function obtener_id_pregunta($p_title, $p_text)
{
    /* This query may also be susceptible to SQL injection */
    $consulta = mysql_query("SELECT id FROM preguntas WHERE pregunta='" . $p . "' AND texto='" . $t . "'");
    while($item = mysql_fetch_array($consulta))
    {
        return $item['id'];
    }
}

function guardar_pregunta($p_title, $p_text, $p_resp)
{
    $id_tmp = $_SESSION['id'];

    /* This query is susceptible to SQL injection not least because there's 
       no data validation. */
    $insert = "INSERT INTO preguntas (pregunta, texto, id_usuario, fecha, responde_a) VALUES ('$p_title', '$p_text', '$id_tmp', NOW(), '$p_resp')";
    $qry = mysql_query($insert);
    if(mysql_affected_rows())
    {
        mostrar_notificacion("La pregunta $p_title ($p_text)($p_resp) se guardo");
        return true;
    }
    else
    {
        mostrar_notificacion("Error Ingresando datos");
        return false;
    }
    return false;
}

打印表单

function imprimir_formulario_pregunta()
{ 
    $html  = '<form id="preguntas" name="preguntas" method="post" action="preguntas.php">' . "\n";
    $html .= '    <div>' . "\n";
    $html .= '        <h2>Pregunta</h2>' . "\n";
    $html .= '        <input name="q" id="q" type="text" />' . "\n";
    $html .= '    </div>' . "\n";
    $html .= '    <div>' . "\n";
    $html .= '        <h2>Explica tu duda</h2>' . "\n";
    $html .= '        <textarea name="texto" id="texto"></textarea>' . "\n";
    $html .= '    </div>' . "\n";
    $html .= '    <div>' . "\n";
    $html .= '        <h2>Etiquetas (separadas por comas)</h2>' . "\n";
    $html .= '        <input name="tags" id="tags" />' . "\n";
    $html .= '    </div>' . "\n";
    $html .= '    <div>' . "\n";
    $html .= '        <input name="responde_a" style="display:none;" id="responde_a" value="0" />' . "\n";
    $html .= '        <button name="pregunta" id="pregunta" type="submit">Publicar</button>' . "\n";
    $html .= '    </div>' . "\n";
    $html .= '</form>' . "\n";

    echo $html;
}