Я работаю над php-скриптом, который хранит идентификаторы сообщений (Msg_ID, Ref_ID) в соответствующих таблицах учетных записей пользователей.

Что у меня есть, Msg_ID правильно написан, но Ref_ID всегда пуст. Но когда я запускаю запрос отдельно, он работает, но не работает в скрипте по какой-то странной причине.

Вот код:

    $qry = "SELECT Ref_ID FROM Chat WHERE Msg_ID = " .$MsgID. ")";
    $resp = mysqli_query($con, $qry);

    $xx = mysqli_fetch_array($resp);
    $ref_id = $xx['Ref_ID'];

    foreach ($Array as $user){
        $query = "Insert into ".$user."(POST_ID, REF_ID) values ('". $MsgID . "', '" .$ref_id. "')";
        mysqli_query($con, $query);
    }

$ Ref_id всегда пусто, и в результате пустое значение записывается в соответствующую базу данных. Некоторая помощь с тем, что не так, будет полезна.

Вот полный код:

<?php
function PostMainThread($Heading, $Message, $Author, $MarkedList){
    $con=mysqli_connect("mysql.serversfree.com", "u521497173_root", "123456", "u521497123_mydb");
    $Array = explode(',', $MarkedList);
    if (mysqli_connect_errno()){
        $response["success"] = 0;
        $response["message"] = "Connection Failed.";
        echo json_encode($response);
    }else{
        here:$MsgID = rand(1, 9999999);
        $query = "Insert into Chat(Msg_ID, Header, MsgBody, Author) values (". $MsgID . "," . "'" . $Heading . "' ," .
            "'" . $Message . "', '". $Author . "')";
        $result=mysqli_query($con, $query);
        if (!$result){
            goto here;
        }else{
            //Put the MsgID in the respective user tables.
            $qry = "SELECT Ref_ID FROM Chat WHERE Msg_ID = " .$MsgID. ")";
            $resp = mysqli_query($con, $qry);

            $xx = mysqli_fetch_array($resp);
            $ref_id = $xx['Ref_ID'];

            foreach ($Array as $user){
                $query = "Insert into ".$user."(POST_ID, REF_ID) values ('". $MsgID . "', '" .$ref_id. "')";
                mysqli_query($con, $query);
            }

            $response["success"] = 1;
            $response["message"] = "Submission successful.";
            mysqli_close($con);
            echo json_encode($response);
        }

    }
}

function PostReplyToThread($PostID, $Author, $Reply){
    $con=mysqli_connect("mysql.serversfree.com", "u521497123_root", "123456", "u521497123_mydb");
    if (mysqli_connect_errno()){
        echo 2;
    }else{
        $query = "Insert into Chat(Msg_ID, Header, MsgBody, Author) values (". $PostID . "," . "'" . " " . "' ," .
            "'" . $Reply . "', '". $Author . "')";
        $result=mysqli_query($con, $query);
        if ($result){
            echo 3;
        }else{
            echo 4;
        }
        mysqli_close($con);
    }
}

if (isset($_POST['what_to_do'])){
    if ($_POST['what_to_do'] == 0){
        if ((isset($_POST['Title'])) &&(isset($_POST['Body']))&&(isset($_POST['Marked']))&&(isset($_POST['_Author']))){
            PostMainThread($_POST['Title'], $_POST['Body'], $_POST['_Author'], $_POST['Marked']);
        }
    }else if ($_POST['what_to_do'] == 1){
        if ((isset($_POST['Thread_ID'])) &&(isset($_POST['Answer']))&&(isset($_POST['_Author']))){
            PostReplyToThread($_POST['Thread_ID'], $_POST['_Author'], $_POST['Answer']);
        }
    }
}else{
    $response["success"] = 0;
    $response["message"] = "Unspecified action";
    echo json_encode($response);
}

Определение таблицы чата:

Create table Chat(Ref_ID INT Auto_Increment, Msg_ID INT, Header varchar(50), MsgBody varchar(500
), Author varchar(30), Primary Key(Ref_ID, Msg_ID));
0
Priyabrata 3 Апр 2014 в 19:25
Эм, вам действительно стоит прочитать об обработке ошибок ... вы летите вслепую!
 – 
arkascha
3 Апр 2014 в 19:29
Также вы должны прочитать о преимуществах «подготовленных операторов» и почему их использование важно.
 – 
arkascha
3 Апр 2014 в 19:31
Ну, я не могу понять, что здесь не так. Поскольку в базу данных не записывается только Ref_ID.
 – 
Priyabrata
3 Апр 2014 в 19:37
Запрос об ошибке из базы данных может быть хорошим началом для понимания ...
 – 
arkascha
3 Апр 2014 в 19:39

1 ответ

Лучший ответ
$xx = mysqli_fetch_array($resp);

Вернет только массив с числовым индексом, например, $ xx [0], $ xx [1].

Чтобы использовать имена столбцов, вам необходимо использовать:

$xx = mysqli_fetch_array($resp, MYSQLI_ASSOC);

Или более короткая версия:

$xx = mysqli_fetch_assoc($resp);

В качестве побочного примечания не забывайте о безопасности: при вставке данных, которые поступают извне функции и могут иметь кавычки или SQL, их необходимо экранировать!

$Heading = mysqli_real_escape_string($con, $Heading);

В противном случае он вернется, чтобы укусить вас.

1
WhoIsRich 6 Апр 2014 в 16:59
Следует упомянуть, что есть также mysqli_fetch_assoc, который является более коротким способом сделать то же самое.
 – 
WhoIsRich
6 Апр 2014 в 16:56