私はクエリを格納するデータを扱う関数を持っています。私はすでに作成されたレコードを更新することで失われた。PHP:MYSQLのレコードを配列から更新する
function storeData($form_data, $table_name, $cxn){
if(!is_array($form_data)){
return false;
exit();
}
//calls a function that cleans the data and returns it
$clean_data = washData($form_data);
$fields=implode(",", array_keys($clean_data));
$values=implode('","', array_values($clean_data));
$query = "INSERT INTO $table_name ($fields) VALUES (\"$values\")";
if($result=mysqli_query($cxn, $query)){
return true;
}
else{
foreach ($clean_data as $key => $value) {
if ($key =="Username") {
echo $value;
$sql = "SELECT * FROM $table_name WHERE $key = $value";
if($result=mysqli_query($cxn, $sql))
$update = "UPDATE $table_name SET $key = $value";
}
}
}
}
washdataのfucntion:
function washData($data){
if(!is_array($data)){
return false;
exit();
}
foreach($data as $field => $value){
$field_array[]=$field;
$value_array[]=strip_tags(trim($data[$field]));
}
return array_combine($field_array, $value_array);
}
この機能は明らかに動作しません。私は、オブジェクトを反復した後に捕まってしまいました。私はUsername
を探して、そのユーザー名に基づいてクエリを作成しようとしました。私は配列からこれらの値を取得し、それらをデータベースに設定する必要がありました。ユーザー名が変数に格納されていることを確認した後、オブジェクトを反復処理すると思っていましたか?私はそれを別の関数に分岐するつもりですが、if-statements
では複雑になっています。
EDIT:提案された解決策を反映するstoreData
機能を変更:
function storeData($form_data, $table_name, $cxn){
if(!is_array($form_data)){
return false;
exit();
}
$types = str_repeat("s", count($form_data));
$params = array();
$params[] = &$types;
$keys = array_keys($form_data);
$values = array_values($form_data);
for ($i = 0; $i < count($values); $i++) {
$params[] = &$values[$i];
}
$sql = "INSERT INTO $table_name (" . implode(',', $keys) . ") VALUES (" .
implode(',', array_fill(0, count($values), '?')) . ")
ON DUPLICATE KEY UPDATE ";
$updates = implode(',', array_map(function($col) {
return "$col = VALUES($col)";
}, $keys));
$sql .= $updates;
$stmt = mysqli_prepare($cxn, $sql);
call_user_func_array(array($stmt, 'bind_param'), $params);
return mysqli_stmt_execute($stmt);
}
を、私は戻って、このMSGを受けています:
警告<b>Warning</b>: call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in <b>somepath/</b> on line <b>37</b><br />
を:mysqli_stmt_execute()にパラメータ1を期待mysqli_stmtである、ブール値somepath/ on line
通常は適切なことをしないような関数として 'washData()'について気分が悪いです。 – tadman
**警告**:mysqliを使用する場合は、[パラメータ化されたクエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)を使用してクエリにユーザーデータを追加します。**重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成したため、文字列の補間または連結を使用してこれを実行しないでください。 ** '$ _POST'、' $ _GET'、**任意の**ユーザデータを直接クエリーに入れないでください。誰かがあなたのミスを悪用しようとすると非常に危険です。 – tadman
あなた自身のORMを書くための一歩前進として、[Doctrine](http://www.doctrine-project.org/)、[Propel](http://propelorm.org /)または[Eloquent](https://laravel.com/docs/5.4/eloquent)?これらはあなたが望むすべてのことを行い、さらに試行され、テストされ、十分に文書化されます。 – tadman