Kann ich in der function column_default die Verwendung von Abfragen vereinfachen

In der unteren function column_default habe ich mehrere Fälle, die fast dieselbe Abfrage ausführen.

Ist es möglich, nur eine Abfrage für alle 3 Fälle zu verwenden? Und wenn ja, wie verwende ich es im folgenden Beispiel? Danke für die Hilfe.

function column_default($item, $column_name){ global $wpdb; /* if ( ! in_array( $column_name, ['id', 'user_id', 'user_email', 'answer', 'answer_time', 'ip_address' ] ) ) return ''; $sql = "SELECT $column_name as result FROM {$wpdb->prefix}rdp_participants_answers WHERE user_id = %d ORDER BY id DESC LIMIT 1 "; $query = $wpdb->get_row( $wpdb->prepare( $sql, $item[ 'ID' ] ) ); if ( is_object( $query ) ) return $query->result; */ switch($column_name){ // case 'id': return $item['ID']; case 'user_id': return $item['ID']; case 'user_email': $user_info = get_userdata($item['ID']); return $user_info->user_email; case 'display_name': $user_info = get_userdata($item['ID']); return $user_info->display_name; case 'city': return get_user_meta($item['ID'], 'city', true); case 'age': return get_user_meta($item['ID'], 'age', true); case 'user_status': $user_status = get_user_meta($item['ID'], 'status', true); if($user_status == 1) { return '   '; } elseif($user_status == 0) { return ' '; } case 'answer': $arrAnswer = $wpdb->get_row( "SELECT answer FROM {$wpdb->prefix}rdp_participants_answers WHERE user_id = ".$item['ID']." ORDER BY id DESC LIMIT 1 " ); if(count($arrAnswer) == null) return 0; else return $arrAnswer->answer; case 'answer_time': $arranswerTime = $wpdb->get_row( "SELECT answer_time FROM {$wpdb->prefix}rdp_participants_answers WHERE user_id = ".$item['ID']." ORDER BY id DESC LIMIT 1 " ); if(count($arranswerTime) == null) return 0; else return $arranswerTime->answer_time; case 'ip_address': $arrIPAddress = $wpdb->get_row( "SELECT ip_address FROM {$wpdb->prefix}rdp_participants_answers WHERE user_id = ".$item['ID']." ORDER BY id DESC LIMIT 1 " ); if(count($arrIPAddress) == null) return 0; else return $arrIPAddress->ip_address; case 'user_registered': return $item['user_registered']; case 'actions': return $item[$column_name]; default: return 'EditView'; } } $query = "SELECT * FROM wp_users AS usr JOIN wp_usermeta AS meta ON meta.user_id = usr.ID LEFT JOIN wp_rdp_participants_answers as ans ON ans.user_id = usr.ID WHERE ans.answer IS NOT NULL GROUP BY usr.ID, usr.user_email ORDER BY ans.id ASC"; $data = $wpdb->get_results($query,ARRAY_A); $this->items = $data; 

Solutions Collecting From Web of "Kann ich in der function column_default die Verwendung von Abfragen vereinfachen"

Dein Problem ist meist nur eine Änderung in der PHP-Logik, nicht wirklich WordPress. Wie auch immer, wir sind hier, um zu helfen, und das wäre auch auf anderen Seiten nicht der Fall, also …

  1. Es ist bedauerlich, dass Sie auf eine globale Variable zugreifen müssen, um die aktuelle databaseverbindung nutzen zu können. Machen Sie anderen (Sie in 6 Monaten!) Das Leben leichter und importieren Sie globale Variablen immer an der Spitze eines functionskörpers.

    Wenn Sie später nach allen Zugriffen auf diese Variablen suchen, danken Sie Ihrem früheren Selbst dafür. 🙂
    In meinem Code verwende ich hauptsächlich classnmethoden als Callbacks, und ich übergebe das $wpdb Objekt als eine Abhängigkeit in den classnkonstruktor, also muss ich diese globale Variable nur einmal berühren, ganz oben in meiner Code-Hierarchie.

  2. Wenn Sie jedes Mal fast die gleiche Abfrage verwenden, schauen Sie sich die Unterschiede an und machen Sie diese entweder zu einer Variablen oder vereinheitlichen Sie sie. In Ihrem Fall können Sie einfach die Variable $column_name , da sie den Spaltennamen der databasetabelle und eine Whitelist gültiger Strings vergleicht . Außerdem können Sie die resultierende Variable umbenennen : SELECT x as foo FROM …

  3. $item[ 'ID' ] ist unbekannt, es kann alles sein. Bereiten Sie immer unbekannte Werte vor, bevor Sie sie an die database senden . $wpdb hat die Methode prepare() , die ähnlich wie sprintf() .

  4. Sie müssen count() für das Abfrageergebnis nicht ausführen. Sie erhalten ein Objekt nur bei Erfolg, also ist der schnellere Test gegen is_object() gut genug.

  5. Verschieben Sie diesen Code in eine separate function . Es tut zu viel.

Beispielcode für alle diese Punkte:

 function answer_query( $column_name, $id ) { global $wpdb; $sql = "SELECT %s as result FROM {$wpdb->prefix}rdp_participants_answers WHERE user_id = %d ORDER BY id DESC LIMIT 1 "; $query = $wpdb->get_row( $wpdb->prepare( $sql, $column_name, $id ) ); if ( is_object( $query ) ) return $query->result; return 0; } 

Reduzieren Sie den Code in Ihrer switch statement wie folgt:

 case 'answer': case 'answer_time': case 'ip_address': return answer_query( $column_name, (int) $item['ID'] ) );