HTML-форма - PHP неправильно вставляется в базу данных - PullRequest
0 голосов
/ 20 декабря 2010

Я только пытаюсь заставить работать форму. Это похоже на то, чем я сейчас занимаюсь: вопрос, текст, теги.

Хорошо,

это когда я печатаю форму

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 ]

3 голосов
/ 20 декабря 2010

Трудно понять, что происходит - как говорит @vincebowdren, вам просто нужно отлаживать этот шаг на каждом этапе.

Однако, что еще более тревожно, вы используете данные $ _POST непосредственно в запросе SQL- это атака SQL-инъекции, ожидающая .

Убедитесь, что вы включили ALL такие переменные в mysql_real_escape_string в свои запросы.

например:

 $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)."')";

См. Как я могу предотвратить внедрение SQL в PHP? для получения дополнительной информации.

0 голосов
/ 20 декабря 2010

@ Тони Мишель Каубе: Я немного переписал ваш код, чтобы сделать его более читабельным, и его также будет немного легче отлаживать.Пожалуйста, обратите внимание на /* 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;
}
0 голосов
/ 20 декабря 2010

Используйте echo для вывода значения проблемной переменной ($ _POST ['q'], $ p_title, $ a) на каждом этапе.Тогда вы увидите, когда он получит значение, которого вы не ожидали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...