PHP УДАЛИТЬ сразу после выбора

У меня есть скрипт сервера PHP, который выбирает некоторые данные из базы данных MySQL.

Как только я получаю результат от mysql_query и mysql_fetch_assoc, хранящихся в моих собственных локальных переменных, я хочу удалить только что выбранную строку.

Проблема с этим подходом заключается в том, что, по-видимому, PHP сделал pass-by-reference для моих локальных переменных вместо pass-by-value, и мои локальные переменные становятся неопределенными после команды delete.

Есть ли способ обойти это? Вот мой код:

$query="SELECT id, peerID, name FROM names WHERE peer = $userID AND docID = '$docID' AND seqNo = $nid"; $result = mysql_query($query); if (!$result) self::logError("FAIL:1 getUsersNamesUpdate() query: ".$query."\n"); if (mysql_num_rows($result) == 0) return array(); $row = mysql_fetch_assoc($result); $result = array(); $result["id"] = $row["id"]; $result["peerID"] = $row["peerID"]; $result["name"] = $row["name"]; $query="DELETE FROM names WHERE id = $result[id];"; $result = mysql_query($query); if (!$result) self::logError("FAIL:2 getUsersNamesUpdate() query: ".$query."\n"); return $result; 

Related of "PHP УДАЛИТЬ сразу после выбора"

Вы переписываете переменную $result своим вторым выражением:

 $query="DELETE FROM names WHERE id = $result[id];"; $result = mysql_query($query); // result does not contain the array anymore 

Измените имя на другое. Это не имеет никакого отношения к обращению к вызову или к такому.


На самом деле, ваше первое присваивание значений не нужно, поскольку $row уже является массивом:

 $row = mysql_fetch_assoc($result); $result = array(); $result["id"] = $row["id"]; $result["peerID"] = $row["peerID"]; $result["name"] = $row["name"]; 

Вы можете просто сделать:

 $row = mysql_fetch_assoc($result); // at the end return $row; 

Тогда вам даже не нужно менять имя переменной для второго оператора. Но подумайте об использовании значимых имен переменных.

Прежде всего, почему бы просто не использовать только один запрос для delete интересующей вас строки?

Что-то вроде этого должно сделать трюк, я полагаю:

 delete from names where peer = $userID AND docID = '$docID' AND seqNo = $nid 

Конечно, не забывайте избегать / конвертировать значения, которые должны быть 😉

Таким образом, нет необходимости в select запроса, а затем delete его.

Во-вторых: чтобы сделать код более понятным для чтения / понимания / поддержки, вы, вероятно, не должны повторно использовать одну и ту же переменную для нескольких целей.

Здесь переменная $resul t используется для нескольких целей, и это затрудняет понимание:

  • ресурс, возвращенный первой mysql_query
  • то массив, содержащий данные из первой строки
  • то ресурс, возвращаемый второй mysql_query

Это немного сбивает с толку, и в один прекрасный день это приведет к ошибкам …
На самом деле, это уже есть 😉 : третье задание переопределяет данные, которые вы получаете со вторыми, и бум, вы потеряли информацию, соответствующую строке, которую вы только что удалили 😉