PHP - как использовать массив в функции? - PullRequest
1 голос
/ 21 октября 2011

Я получаю массив значений, возвращаемых следующей функцией:

function get_subscribitions($user)
{

$user = mysql_real_escape_string ($user);
$sql = "SELECT 'user_id' FROM `subscribe` WHERE subscriber = '$user'";
$result = mysql_query($sql);
$rows = array();   
while ($row = mysql_fetch_assoc($result)) {
   $rows[] = $row;
}    
mysql_free_result($result); 
return $rows;

Теперь я хочу использовать эти значения в новой функции, где каждый «user_id» используется для сбора текста из базы данных с помощью этой функции:

function get_text($writer) {
$writer = mysql_real_escape_string ($writer);
$sql = "SELECT * FROM `text` WHERE user_id='$writer' ORDER BY timestamp desc";
$result = mysql_query($sql);
$rows = array();
while ($row = mysql_fetch_assoc($result)) {
   $rows[] = $row;
}

mysql_free_result($result);
return $rows;

Однако возвращаемое значение из первой функции является массивом, и, как я понял сложным путем, массивы не могут быть обработаны "mysql_real_escape_string".

Как я могу заставить вторую функцию обрабатывать значения, полученные из первой функции?

Любые ответы приветствуются. Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 21 октября 2011

Ваша первая ошибка - использовать mysql_fetch_assoc при выборе только одного столбца.Вы должны использовать mysql_fetch_row для этого.Это, вероятно, решит вашу основную проблему.

Может выглядеть так:

$subs = get_subscribitions($whateverId);
$texts = get_text($subs);

function get_subscribitions($user)
{
    $user = mysql_real_escape_string ($user);
    $sql = "SELECT 'user_id' FROM `subscribe` WHERE subscriber = '$user'";
    $result = mysql_query($sql);
    $rows = array();

    while ($row = mysql_fetch_row($result)) {
        $user_id = $row['user_id'];
        $rows[$user_id] = $user_id;
    }
    mysql_free_result($result);
    return $rows;
}

function get_text($writer) {
    $writers = implode(",", $writer);
    $sql = "SELECT * FROM `text` WHERE user_id IN ({$writers}) ORDER BY timestamp DESC";
    $result = mysql_query($sql);
    $rows = array();

    while ($row = mysql_fetch_array($result)) {
        $rows[] = $row;
    }

    mysql_free_result($result);
    return $rows;
}

Это сэкономит вам много времени, потому что вы можете получить все данные из 'text' водно утверждение.

2 голосов
/ 21 октября 2011

Решение состоит в том, чтобы избежать размещения массивов в массиве $rows в первой функции. Вместо:

while ($row = mysql_fetch_assoc($result)) {
    $rows[] = $row;
}

попробовать:

while ($row = mysql_fetch_assoc($result)) {
    $rows[] = $row['user_id'];
}

Это поместит только значение из столбца 'user_id' в массив $rows.

1 голос
/ 21 октября 2011

Как говорит Джордж Камминс,

while ($row = mysql_fetch_assoc($result)) {
    $rows[] = $row['user_id'];
}

и, чтобы ускорить вторую функцию:

function get_text($writer)
{
    $sql = "SELECT * FROM `text` WHERE user_id in (".implode(',',$writer).") ORDER BY timestamp desc";
    $rows = array();
    if ($result = mysql_query($sql))
    {
        while ($row = mysql_fetch_assoc($result))
        {
            $rows[] = $row;
        }

        mysql_free_result($result);
    }    

    return $rows;
}

Изменение в запросе означает, что вы выполняете только одну, апо одному для каждого идентификатора, тем самым удаляя время, необходимое для отправки запроса на сервер и получения ответа несколько раз.Также, если запрос не выполняется, функция возвращает пустой массив

1 голос
/ 21 октября 2011

Чтобы использовать вторую функцию, вы должны перебрать массив, возвращенный из первой. Нечто подобное может работать для вас:

$user_subscriptions = get_subscribitions($user);
foreach($user_subscriptions as $subscription) {
    $texts = get_text($subscription['user_id']);

    foreach($texts as $text) {
        // do something with the fetched text
    }
}
0 голосов
/ 21 октября 2011
function get_subscribitions($user)
{
  $user = mysql_real_escape_string ($user);
  $sql = "SELECT 'user_id' FROM `subscribe` WHERE subscriber = '$user'";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($results);
  mysql_free_result($result);
  return intval($row['user_id']);
}

возвращает только тот идентификатор пользователя, который вы можете использовать во 2-й функции

0 голосов
/ 21 октября 2011

Использование:

string implode ( string $glue , array $pieces )
// example, elements separated by a comma :
$arrayasstring = impode(",", $myarray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...