2014-09-10 2 views
0

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

Последняя часть я должен перехода кусок, где я должен обновить несколько строк/записей.

Это, кажется, работает для меня ... Тем не менее, мне любопытно и интересно узнать о моей технике, а также отправить обратно какой-то ответ (логический или другой), что все было успешным или неудачным. Мысли? Комментарии? Предложения?

function timeUpdate($uID, $galArr, $timeStamp) { 
    global $mysqli; //my connection is set elsewhere (bad/good?) 
    $q = "UPDATE someTable SET timeStamp = ? WHERE galleryID = ? AND uniID = ?"; 
    $stmt = $mysqli->prepare($q); 
    $stmt->bind_param("iii", $timeStamp, $gID, $uID); 

    foreach($galArr as $value) { 
     $gID = $value[0]; 
     if(!$stmt->execute()) { 
      throw new Exception($stmt->error, $stmt->errno); 
     } 
    } 
    $stmt->close(); 
} 

Заранее благодарен. Любые ссылки, предложения ценятся.

+0

Я думаю, вы должны спросить, как использовать IN() с подготовленными операторами, потому что использование IN() для galleryID было бы более эффективным, чем этот цикл foreach. – developerwjk

+0

@developerwjk, круто. Я посмотрю, что я могу найти и прочитать. –

ответ

0
  1. всегда рекомендуется пройти соединение в качестве параметра функции вместо использования global. Вы можете исследовать аргументы в пользу этого, если хотите, или просто доверяете моему совету - будет несколько страниц StackOverflow, посвященных этому вопросу.

  2. В подавляющем большинстве случаев функция должна return что-то. В вашем случае, я думаю, имеет смысл возвращать множество результатов успеха/неудачи; или если у вас есть еще одна конкретная потребность, вы можете вернуть все, что захотите.

  3. Ваше использование подготовленного оператора и связанных параметров является разумным/правильным. Я просто хотел бы объяснить, что он не нужен $gID = $value[0];, если вы просто напишете foreach(array_column($galArr) as $gID){. Эта декларация будет достаточной для подачи переменной до execute(). Тем не менее, если вы можете подготовить и передать данные первого столбца от $galArr к своей пользовательской функции, у вас будет более чистый бит кода в вашей функции ... (foreach($gIDs as $gID){).

  4. Очень важно: я предпочитаю не объявлять одноразовые переменные. В соответствии с этим принципом я бы не объявил $q и не хотел просто написать строку в prepare(). (Это не большая проблема - вы можете игнорировать это предложение, если вам нравится)


индивидуализированные запросы для улучшения отслеживания исходов:

function timeUpdate($mysqli, $uID, $galArr, $timeStamp) { 
    if(!$stmt=$mysqli->prepare('UPDATE someTable SET timeStamp = ? WHERE galleryID = ? AND uniID = ?')){ 
     return $result[]=['syntax'=>'fail','outcome'=>'Prepare Error: '.$mysqli->error]; 
    }elseif(!$stmt->bind_param("iii", $timeStamp, $gID, $uID)){ 
     $result[]=['syntax'=>'fail','outcome'=>'Bind Error: '.$stmt->error]; 
    }else{ 
     foreach(array_column($galArr,0) as $gID) { // if these values are not unique, misinformation will be possible because I am using $gID as $result keys 
      if(!$stmt->execute()) { 
       $result[$gID]=['syntax'=>'fail','outcome'=>'Error: '.$stmt->error]; 
      }else{ 
       $result[$gID]=['syntax'=>'pass','outcome'=>'Affected Rows: '.$stmt->num_rows()]; 
      } 
     } 
    } 
    $stmt->close(); 
    return $result; 
} 

Лучшая практика подсказывает, что вам сделайте наименьшее количество запросов для данной задачи. Ваша задача может быть объединена в один запрос UPDATE с использованием предложения WHERE/IN. Несчастливо подготовленные инструкции mysqli требуют запутанного процесса при обработке переменной количества заполнителей. See this post для чего это может выглядеть. (PDO намного лучше приспособлен для обработки переменных данных). Поэтому в основном я говорю, что есть компромисс, если вы хотите сделать один вызов в базе данных - вам придется писать намного больше (сложнее read), и у вас будет намного меньше контроля над сообщением о пропуске/сбое, которое вы возвращаете.

Смежные вопросы