2009-04-14 6 views
2

J'ai un formulaire, dont le but est de placer l'enregistrement actuellement affiché dans une catégorie. J'utilise le code html suivant via php pour le faire:mysql paramètres d'instruction préparés et les requêtes de commande

<form name="categoryForm"> 
    <input name="radiobutton" type="radio" value="fakeapproved" />Fake (Approved)<p> 
    <input name="radiobutton" type="radio" value="fakesuspected" />Fake (Suspected)<p> 
    <input name="radiobutton" type="radio" value="keyword" />Forbidden Keywords<p> 
    <input name="radiobutton" type="radio" value="parallelimport" />Parallel Imports 
    <input name="Submit" type="submit" value="Update" onclick="handleClick(".$pk.");return false"/> 
</form> 

À l'heure actuelle, j'ai simplement une table ENCHÈRES, avec une colonne de catégorie, et cette colonne est à l'une des catégories définies dans ma forme .

Cette approche n'est pas efficace pour ce que j'ai besoin de faire avec les données, donc je prévois de le changer pour avoir une colonne séparée pour chaque catégorie, qui peut être définie sur vrai ou faux.

Ce que je voudrais savoir, c'est s'il est possible d'utiliser le texte défini dans mon formulaire et obtenu via ma fonction javascript, dans ma requête sql.

Par exemple, des ventes aux enchères de mise à jour définies textfromfrom de $ = true

En ce moment, je me sers de la déclaration préparée suivant:

if($cmd=="addcat"){ 
    $alterQuery = "UPDATE auctions SET category = ? WHERE article_no= ?"; 
    if ($altRecord = $con->prepare($alterQuery)) { 
    $altRecord->bind_param("ss", $subcat, $pk); 
    $altRecord->execute(); 
    $altRecord->close(); 
    echo "true"; 
    } else { 
    echo "false"; 
    } 
} 

est-il un moyen de remplacer

$alterQuery = "UPDATE auctions SET category = ? WHERE article_no= ?"; 

avec $ alterQuery = "Mettre à jour les enchères SET? = true WHERE article_no =?";

Serait-il également possible d'exécuter une requête séparée immédiatement après, à savoir:

if($cmd=="addcat"){ 
    $alterQuery = "UPDATE auctions SET ? = true WHERE article_no= ?"; 
    $insertQuery = "INSERT into users (username, ?) values ?, true"; 
    if ($altRecord = $con->prepare($alterQuery)) { 
    $altRecord->bind_param("ss", $category, $pk); 
    $altRecord->execute(); 
    if ($insRecord = $con->prepare($insertQuery)) { 
    $insRecord->bind_param("ss", $category, $username); 
    $insRecord->execute(); 
    $insRecord->close(); 
    } 
    $altRecord->close(); 
    echo "true"; 
} else { 
    echo "false"; 
} 

Mon raisonnement pour l'utilisation de l'approche ci-dessus est la suivante:

La base de données de ventes aux enchères est importée d'une autre source, et je ne peux pas changer du tout la structure, sauf pour ajouter des catégories à la fin. Les clés primaires et autres ne doivent pas être changées.

Il y a seulement 4 catégories

Une enchère individuelle peut appartenir à plus d'une catégorie

Le tableau des ventes aux enchères ne traite que des ventes aux enchères. J'aurai besoin d'une table d'utilisateurs, qui consistera principalement de nouvelles entrées d'utilisateur.

Le tableau des utilisateurs doivent être en mesure de montrer pour chaque utilisateur, les catégories qu'ils ont eu des ventes aux enchères dans.

Il ne doit pas avoir plus d'un enregistrement de la table des utilisateurs par utilisateur. Le nom d'utilisateur fonctionnera comme la clé primaire.

Répondre

0

$ alterQuery = "Mettre à jour les enchères SET? = True WHERE article_no =?";

Non, vous ne pouvez pas utiliser les paramètres de requête pour les noms de colonnes. Les paramètres de requête peuvent être utilisés seulement à la place d'une valeur littérale dans une expression SQL.

Vous devez utiliser SQL dynamique. C'est-à-dire, formez une instruction SQL en tant que chaîne et interpolez vos variables d'application dans cette chaîne en tant que noms de colonnes.

+0

Voulez-vous dire quelque chose comme: $ alterQuery = "UPDATE enchères SET $ category = true WHERE article_no =? "; où $ catégorie pourrait être définie en fonction de l'entrée? –

+0

Oui, exactement. Toutes les tables et colonnes doivent être nommées dans la chaîne SQL avant de préparer la requête. –

0

Il est le point de préparer des requêtes que rien, sauf les données va changer. Vous pouvez préparer différentes requêtes pour chaque catégorie que vous possédez (les placer dans un tableau indexé par nom de catégorie). Mais je doute que la préparation des requêtes fasse vraiment une différence ici.

+0

Rien sauf les données va changer, c'est juste que la catégorie dans laquelle un enregistrement sera ajouté est arbitraire, sur une liste prédéfinie. –

1

Yikes, dénormalisation de base de données classique ici sur le point de se produire. Tu ne veux pas faire ça. Vous voulez pour le garder soit une seule colonne, ou, comme il semble nécessaire d'être, créer une relation de un à plusieurs entre les ventes aux enchères et le type. Votre premier signe que quelque chose ne va pas est qu'il n'y a pas de chemin facile pour faire ce que vous essayez de faire.

Une meilleure approche serait de créer une table d'enchères, et une table categoryAuctionForm ...

Il ressemblerait à ceci:

auctions Table: 
auction_id 
--------- 
0 
1 
2 
3 

auctions Type: 
auction_type_id auction_id auction_type 
1    0   something 
2    0   othertype 
3    0   fake 
4    1   othertype 
5    2   fake 
6    3   fake 

Vous pouvez également ajouter plus de niveaux de normalisation tels que la création d'un colonne auction_type.

Juste ma pensée.

+0

J'ai mis à jour ma question pour montrer pourquoi je pense que je dois utiliser l'approche que j'ai décrite .. J'apprécierais vos pensées à ce sujet –

Questions connexes